Zarządzanie treściami i odtwarzanie ich

Z tego artykułu dowiesz się, jak zarządzać treściami wideo za pomocą menedżera wstępnego wczytywania. Korzystając z menedżera wstępnego wczytywania, możesz zapewnić użytkownikowi większą wygodę. Gdy przełączy się on z jednego elementu multimedialnego na inny, odtwarzanie rozpocznie się szybciej, ponieważ menedżer 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 na przykład Twoja aplikacja zawiera karuzelę filmów, dodaj te filmy do menedżera wstępnego wczytywania. W zależności od przypadku możesz dodać wszystkie filmy lub tylko te, które znajdują się w pobliżu aktualnie odtwarzanego filmu. Później możesz też dodać do menedżera wstępnego wczytywania nowe elementy.

Dodanie elementów multimedialnych samo w sobie nie powoduje rozpoczęcia wczytywania treści przez menedżera wstępnego wczytywania. Aby uruchomić wstępne ładowanie, musisz unieważnić priorytety w menedżerze wstępnego ładowania.

val initialMediaItems = pullMediaItemsFromService(/* count= */ 20);
for (index in 0 until initialMediaItems.size) {
  preloadManager.add(initialMediaItems.get(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 służąca do pobierania listy treści do odtworzenia. Kod wywołuje tę metodę, aby pobrać listę maksymalnie 20 elementów.
  • preloadManager to DefaultPreloadManager utworzony w sekcji TworzenieDefaultPreloadManager. Kod wywołuje metodę add() menedżera, aby dodać każdy element 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 elementu, który jest obecnie odtwarzany.

Unieważnianie priorytetów w menedżerze wstępnego ładowania

Aby uruchomić menedżera wstępnego wczytywania i rozpocząć wstępne wczytywanie treści, 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 dodasz nowe elementy multimedialne do menedżera wstępnego wczytywania lub usuniesz elementy multimedialne. Jeśli dodajesz lub usuwasz kilka elementów, dodaj je wszystkie, a potem wywołaj 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 utworzoną przez Ciebie funkcję, aby dowiedzieć się, ile treści powinien wczytać z każdego elementu. Następnie wczytuje treści dla każdego elementu w kolejności priorytetów od najwyższego do najniższego.

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 będzie szybsze niż w przypadku, gdyby nie został użyty. Jeśli menedżer wstępnego wczytywania nie wczytał jeszcze treści z tego elementu, odtwarzanie przebiega normalnie.

// When a media item is about to display on the screen
val mediaSource = preloadManager.getMediaSource(mediaItem)
if (mediaSource != null) {
    player.setMediaSource(mediaSource)
}
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ć odtwarzacz, wywołując metodę DefaultPreloadManager.Builder.buildExoPlayer() w tym samym konstruktorze, którego użyto do utworzenia 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 nie rozpoczął jeszcze wczytywania treści. W takim przypadku zwraca on obiekt MediaSource, który nie zawiera wstępnie wczytanych danych. Może się tak zdarzyć, gdy użytkownik nagle przesunie się daleko do przodu w karuzeli.
  • Gdy użytkownik odtworzy nowy element multimedialny, wywołaj funkcję setCurrentPlayingIndex, aby poinformować menedżera wstępnego wczytywania, w którym miejscu karuzeli znajduje się nowy element. Menedżer wstępnego wczytywania potrzebuje tych informacji, aby określić 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, usuwaj z niego elementy, których nie musi już śledzić. Możesz też usuwać elementy, które nadal znajdują się w karuzeli, ale są daleko od bieżącej pozycji użytkownika. Możesz na przykład zdecydować, że jeśli element znajduje się w odległości większej niż 15 elementów od tego, co ogląda użytkownik, nie musi być wstępnie wczytywany. W takim przypadku usuniesz elementy, gdy znajdą się w takiej odległości. Jeśli użytkownik wróci do usuniętych elementów, zawsze możesz dodać je z powrotem.

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

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