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
- Unieważnij priorytety w menedżerze wstępnego wczytywania
- Pobieranie i odtwarzanie multimediów
- Usuwanie elementów z menedżera wstępnego wczytywania
- Zwalnianie menedżera wstępnego wczytywania po zakończeniu pracy
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
toDefaultPreloadManager
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 przypadkuDefaultPreloadManager
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 funkcjiinvalidate()
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 Media3ExoPlayer
, 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 obiektMediaSource
, 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łajinvalidate()
, 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
- Jeśli chcesz usunąć wszystkie elementy z menedżera wstępnego wczytywania, możesz wywołać
reset()
zamiastremove()
. To podejście jest przydatne, jeśli chcesz zmienić wszystkie elementy w karuzeli. W takim przypadku po usunięciu elementów musisz dodać nowe elementy do menedżera wstępnego wczytywania, a następnie unieważnić priorytety w menedżerze wstępnego wczytywania.
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 obiektuDefaultPreloadManager
. Nie próbuj ponownie używać starego kreatora.