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 nadaje priorytet wczytywaniu 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 wczytywania może wysyłać zapytania, aby sprawdzić, czy element multimedialny jest gotowy do wczytania i ile danych należy wczytać. - Utwórz narzędzie do tworzenia, którego będziesz używać do tworzenia menedżera wstępnego wczytywania i obiektów
ExoPlayer
aplikacji. - Aby utworzyć menedżera wstępnego wczytywania, użyj kreatora, wywołując jego metodę
build()
.
Tworzenie elementu sterującego stanem wstępnego wczytywania elementu docelowego
Podczas tworzenia obiektu 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: powrót
PreloadStatus.SOURCE_PREPARED
- W przypadku wszystkich innych 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 menedżera wstępnego wczytywania przekażesz do niego instancję
MyTargetPreloadStatusControl
. currentPlayingIndex
zawiera 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ę
getTargetPreloadStatus
i przekazuje informacje o rankingu określone przez Ciebie dla odpowiedniego elementu multimedialnego. W przypadkuDefaultPreloadManager
te 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 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
MyTargetPreloadStatusControl
to 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
.