Na tej stronie dowiesz się, jak utworzyć DefaultPreloadManager, który wstępnie wczytuje treści multimedialne w aplikacji na podstawie wybranej strategii.
Menedżerowie wstępnego wczytywania oparty na klasie abstrakcyjnej BasePreloadManager umożliwiają Ci sortowanie treści według wybranych kryteriów. Z tego dokumentu dowiesz się, jak używać klasy pochodnej DefaultPreloadManager, w której każdy element multimedialny jest klasyfikowany za pomocą liczby całkowitej reprezentującej jego położenie na liście (np. pozycję w karuzeli wideo). Menedżer wstępnego wczytywania traktuje priorytetowo wczytywanie elementów na podstawie tego, jak blisko są one elementu, który użytkownik aktualnie odtwarza. Dzięki temu, jeśli użytkownik przejdzie do innego elementu, nowy element może od razu zacząć odtwarzanie.
Utworzenie instancji DefaultPreloadManager składa się z 3 etapów:
- Zdefiniuj
TargetPreloadStatusControl, o który menedżer wstępnego ładowania może wysyłać zapytania, aby sprawdzić, czy element multimedialny jest gotowy do załadowania i ile danych należy załadować. - Utwórz narzędzie do tworzenia, którego będziesz używać do tworzenia menedżera wstępnego wczytywania i obiektów
ExoPlayeraplikacji. - Aby utworzyć menedżera wstępnego wczytywania, użyj narzędzia do tworzenia, wywołując metodę
build().
Tworzenie elementu sterującego stanem wstępnego wczytywania elementu docelowego
Podczas tworzenia elementu DefaultPreloadManager.Builder przekazujesz do niego zdefiniowany przez siebie obiekt target preload status control. Ten obiekt implementuje interfejs TargetPreloadStatusControl. Gdy menedżer wstępnego wczytywania przygotowuje się do wstępnego wczytania multimediów, wywołuje metodę getTargetPreloadStatus() kontroli stanu, aby określić, ile treści ma wczytać. Kontrolka stanu może odpowiadać jednym z tych kodów stanu:
STAGE_SPECIFIED_RANGE_LOADED: menedżer wstępnego wczytywania powinien wczytać treść od określonej pozycji początkowej przez określony czas (podany w milisekundach).STAGE_TRACKS_SELECTED: menedżer wstępnego wczytywania powinien wczytać i przetworzyć informacje o ścieżce treści oraz wybrać ścieżki. Menedżer wstępnego wczytywania nie powinien jeszcze rozpoczynać wczytywania treści.STAGE_SOURCE_PREPARED: Menedżer wstępnego wczytywania powinien przygotować źródło treści. Jeśli na przykład metadane treści znajdują się w osobnym pliku manifestu, menedżer wstępnego wczytywania może pobrać i przeanalizować ten manifest.null: Menedżer wstępnego wczytywania nie powinien wczytywać żadnych treści ani metadanych tego elementu multimedialnego.
Musisz mieć strategię decydowania o tym, ile treści ma być wczytywanych w przypadku każdego elementu multimedialnego. W tym przykładzie więcej treści jest wczytywanych w przypadku elementów znajdujących się najbliżej aktualnie odtwarzanego elementu. Jeśli użytkownik odtwarza treści z indeksem n, kontroler zwraca te kody:
- Indeks n+1 (następny element multimedialny): wczytaj 3000 ms (3 sekundy) od domyślnej pozycji początkowej.
- Indeks n-1 (poprzedni element multimedialny): wczytaj 1000 ms (1 sekundę) od domyślnej pozycji początkowej.
- Inne elementy multimedialne w zakresie od n-2 do n+2: Return
PreloadStatus.TRACKS_SELECTED - Inne elementy multimedialne w zakresie od n-4 do n+4: zwróć
PreloadStatus.SOURCE_PREPARED - W przypadku wszystkich pozostałych elementów multimedialnych zwróć wartość
null.
class MyTargetPreloadStatusControl( currentPlayingIndex: Int = C.INDEX_UNSET ) : TargetPreloadStatusControl<Int, DefaultPreloadManager.PreloadStatus> { override fun getTargetPreloadStatus(index: Int): DefaultPreloadManager.PreloadStatus? { if (index - currentPlayingIndex == 1) { // next track // return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED and // suggest loading 3000ms from the default start position return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L) } else if (index - currentPlayingIndex == -1) { // previous track // return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED and // suggest loading 3000ms from the default start position return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L) } else if (abs(index - currentPlayingIndex) == 2) { // return a PreloadStatus that is labelled by STAGE_TRACKS_SELECTED return DefaultPreloadManager.PreloadStatus.TRACKS_SELECTED } else if (abs(index - currentPlayingIndex) <= 4) { // return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED return DefaultPreloadManager.PreloadStatus.SOURCE_PREPARED } return null } }
Najważniejsze informacje o kodzie
- Podczas tworzenia konstruktora menedżera wstępnego wczytywania przekażesz instancję
MyTargetPreloadStatusControl. currentPlayingIndexzawiera indeks aktualnie odtwarzanego elementu multimedialnego. Aplikacja musi dbać o to, aby ta wartość była aktualna.- Gdy menedżer wstępnego wczytywania jest gotowy do wczytania treści, wywołuje funkcję
getTargetPreloadStatusi przekazuje informacje o rankingu określone przez Ciebie dla odpowiedniego elementu multimedialnego. W przypadkuDefaultPreloadManagerte informacje o rankingu są liczbą całkowitą określającą pozycję produktu w karuzeli. Metoda wybiera kod do zwrócenia, porównując ten indeks z indeksem aktualnie wybranego elementu.
Tworzenie menedżera wstępnego wczytywania
Aby utworzyć menedżera wstępnego wczytywania, musisz mieć DefaultPreloadManager.Builder.
Ten moduł jest skonfigurowany z bieżącym kontekstem i ustawieniem stanu docelowego wstępnego wczytywania aplikacji. Generator udostępnia też metody ustawiające, których możesz użyć do ustawienia niestandardowych komponentów menedżera wstępnego wczytywania.
Za pomocą kreatora utworzysz nie tylko menedżera wstępnego wczytywania, ale też obiekty ExoPlayer, których aplikacja używa do odtwarzania treści.
val targetPreloadStatusControl = MyTargetPreloadStatusControl() val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl) val preloadManager = preloadManagerBuilder.build()
Najważniejsze informacje o kodzie
MyTargetPreloadStatusControlto klasa zdefiniowana w sekcji Tworzenie elementu sterującego stanem wstępnego wczytywania.- Do tworzenia obiektów
ExoPlayer, które będą odtwarzać treści zarządzane przez ten menedżer wstępnego wczytywania, użyjesz tego samegoDefaultPreloadManager.Builder.