Zarządzanie treściami i odtwarzanie ich

Na tej stronie opisujemy, jak zarządzać treściami wideo za pomocą menedżera wstępnego wczytywania. Dzięki menedżerowi wstępnego wczytywania możesz zapewnić użytkownikom większą wygodę. Gdy użytkownik przełącza się z jednego elementu multimedialnego na inny, odtwarzanie rozpoczyna się szybciej, ponieważ menedżer wstępnie wczytał już część treści.

Na tej stronie znajdziesz informacje na te tematy:

Dodawanie elementów multimedialnych do menedżera wstępnego wczytywania

Musisz poinformować menedżera wstępnego wczytywania o każdym elemencie multimedialnym, który ma śledzić. Jeśli np. Twoja aplikacja ma karuzelę filmów, dodaj te filmy do menedżera wstępnego wczytywania. W zależności od przypadku użycia możesz dodać wszystkie filmy lub tylko te, które znajdują się w pobliżu aktualnie odtwarzanego filmu. Możesz też później dodać nowe elementy do menedżera wstępnego wczytywania.

Samo dodanie elementów multimedialnych nie powoduje, że menedżer wstępnego wczytywania zacznie wczytywać treści. Aby uruchomić wstępne wczytywanie, musisz unieważnić priorytety w menedżerze wstępnego wczytywania.

val initialMediaItems = pullMediaItemsFromService(count = 20)
for (index in 0 until initialMediaItems.size) {
  preloadManager.add(initialMediaItems[index], /* rankingData= */ index)
}
// items aren't actually loaded yet! need to call invalidate() after this

Najważniejsze informacje o kodzie

  • Ten fragment kodu pokazuje, jak wstępnie wypełnić menedżera wstępnego wczytywania po jego utworzeniu. Możesz też wywołać funkcję add(), aby dodać elementy do istniejącego, wypełnionego menedżera wstępnego wczytywania.
  • W tym fragmencie kodu pullMediaItemsFromService() to logika aplikacji, która pobiera listę treści do odtworzenia. Kod wywołuje tę metodę, aby pobrać listę maksymalnie 20 elementów.
  • preloadManager to DefaultPreloadManager utworzony w sekcji Tworzenie DefaultPreloadManager. Kod wywołuje metodę add() tego menedżera, aby dodać każdy element w karuzeli.
  • rankingData to wartość, której menedżer wstępnego wczytywania używa do określania priorytetu każdego elementu multimedialnego. W przypadku DefaultPreloadManager wartość rankingData to liczba całkowita reprezentująca pozycję elementu w karuzeli. Menedżer wstępnego wczytywania określa priorytet na podstawie odległości każdego elementu od aktualnie odtwarzanego elementu.

Unieważnianie priorytetów w menedżerze wstępnego wczytywania

Aby uruchomić wstępne wczytywanie treści przez menedżera wstępnego wczytywania, musisz wywołać funkcję invalidate(), aby poinformować menedżera wstępnego wczytywania, że priorytety elementów są nieaktualne. Należy to zrobić w tych sytuacjach:

  • Gdy dodajesz nowe elementy multimedialne do menedżera wstępnego wczytywania lub usuwasz elementy multimedialne. Jeśli dodajesz lub usuwasz kilka elementów, dodaj je wszystkie, a następnie wywołaj funkcję invalidate().
  • Gdy użytkownik przełącza się z jednego elementu multimedialnego na inny. W takim przypadku przed wywołaniem funkcji invalidate() musisz zaktualizować bieżący indeks odtwarzania, jak opisano w sekcji Pobieranie i odtwarzanie treści.

Gdy unieważnisz menedżera wstępnego wczytywania, wywoła on TargetPreloadStatusControl utworzony przez Ciebie element, aby dowiedzieć się, ile treści ma wczytać z każdego elementu. Następnie wczytuje treści dla każdego elementu w kolejności od najwyższego do najniższego priorytetu.

preloadManager.invalidate()

Najważniejsze informacje o kodzie

  • Wywołanie funkcji invalidate() powoduje ponowną ocenę priorytetu każdego znanego elementu multimedialnego przez menedżera wstępnego wczytywania. Dlatego, jeśli wprowadzasz wiele zmian w menedżerze wstępnego wczytywania, przed wywołaniem funkcji invalidate() musisz zakończyć wprowadzanie zmian.

Pobieranie i odtwarzanie multimediów

Gdy użytkownik przejdzie do nowego elementu multimedialnego, musisz pobrać go z menedżera wstępnego wczytywania. Jeśli menedżer wstępnego wczytywania wczytał już część treści, odtwarzanie rozpocznie się szybciej niż w przypadku, gdybyś nie używał menedżera wstępnego wczytywania. Jeśli menedżer wstępnego wczytywania nie wczytał jeszcze treści z tego elementu, odtwarzanie będzie przebiegać normalnie.

// When a media item is about to display on the screen
val mediaSource = preloadManager.getMediaSource(mediaItem)
if (mediaSource != null) {
  player.setMediaSource(mediaSource)
} else {
  // If mediaSource is null, that mediaItem hasn't been added to the preload manager
  // yet. So, send it directly to the player when it's about to play
  player.setMediaItem(mediaItem)
}
player.prepare()

// When the media item is displaying at the center of the screen
player.play()
preloadManager.setCurrentPlayingIndex(currentIndex)

// Need to call invalidate() to update the priorities
preloadManager.invalidate()

Najważniejsze informacje o kodzie

  • player to Media3 ExoPlayer, którego aplikacja używa do odtwarzania treści. Musisz utworzyć tego odtwarzacza, wywołując funkcję DefaultPreloadManager.Builder.buildExoPlayer() na tym samym konstruktorze którego używasz do tworzenia menedżera wstępnego wczytywania.
  • Gdy użytkownik przełączy się na nowy element multimedialny, aplikacja wywoła funkcję getMediaSource(), aby pobrać źródło multimediów z menedżera wstępnego wczytywania. Musi to być mediaItem który został już dodany do menedżera wstępnego wczytywania. Nie ma znaczenia, czy menedżer wstępnego wczytywania rozpoczął już wczytywanie treści. W takim przypadku zwraca on MediaSource, który nie zawiera wstępnie wczytanych danych. Może się tak zdarzyć, np. gdy użytkownik nagle przeskoczy daleko do przodu w karuzeli.
  • Gdy użytkownik odtworzy nowy element multimedialny, wywołaj funkcję setCurrentPlayingIndex, aby poinformować menedżera wstępnego wczytywania, gdzie w karuzeli znajduje się nowy element. Menedżer wstępnego wczytywania potrzebuje tych informacji, aby ustalić priorytet wczytywania następnego elementu. Po zaktualizowaniu bieżącego indeksu, wywołaj invalidate() aby menedżer wstępnego wczytywania ponownie określił priorytet każdego elementu.

Usuwanie elementów z menedżera wstępnego wczytywania

Aby menedżer wstępnego wczytywania działał wydajnie, usuń elementy, których nie musi już śledzić. Możesz też usunąć elementy, które nadal znajdują się w karuzeli, ale są daleko od bieżącej pozycji użytkownika. Możesz na przykład uznać, że jeśli element znajduje się w odległości większej niż 15 elementów od tego, co ogląda użytkownik, nie trzeba go wstępnie wczytywać. W takim przypadku usuń elementy, gdy znajdą się w takiej odległości. Jeśli użytkownik wróci do usuniętych elementów, zawsze możesz je dodać ponownie.

preloadManager.remove(mediaItem)

Najważniejsze informacje o kodzie

Zwalnianie menedżera wstępnego wczytywania po zakończeniu pracy

Gdy menedżer wstępnego wczytywania nie jest już potrzebny, musisz go zwolnić, aby zwolnić jego zasoby. Pamiętaj, aby zwolnić go, gdy aktywność zostanie zniszczona.

preloadManager.release()

Najważniejsze informacje o kodzie

  • Nie wolno wywoływać żadnych metod obiektu po jego zwolnieniu.
  • Jeśli musisz utworzyć kolejnego menedżera wstępnego wczytywania, utwórz nowy DefaultPreloadManager.Builder i użyj go do utworzenia DefaultPreloadManager. Nie próbuj ponownie używać starego konstruktora.