Tworzenie i konfigurowanie klasy DefaultPreloadManager

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ótPreloadStatus.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 przypadku DefaultPreloadManager 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