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
- Unieważnianie priorytetów 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 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. preloadManagertoDefaultPreloadManagerutworzony w sekcji TworzenieDefaultPreloadManager. Kod wywołuje metodęadd()tego menedżera, aby dodać każdy element w karuzeli.rankingDatato wartość, której menedżer wstępnego wczytywania używa do określania priorytetu każdego elementu multimedialnego. W przypadkuDefaultPreloadManagerwartośćrankingDatato 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 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 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
playerto Media3ExoPlayer, 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ćmediaItemktó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 onMediaSource, 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ł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, 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
- Jeśli chcesz usunąć wszystkie elementy z menedżera wstępnego wczytywania, zamiast
remove()możesz wywołać funkcjęreset(). To podejście jest przydatne, jeśli musisz 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
- Nie wolno wywoływać żadnych metod obiektu po jego zwolnieniu.
- Jeśli musisz utworzyć kolejnego menedżera wstępnego wczytywania, utwórz nowy
DefaultPreloadManager.Builderi użyj go do utworzeniaDefaultPreloadManager. Nie próbuj ponownie używać starego konstruktora.