Crea e configura un DefaultPreloadManager

Questa pagina descrive come creare un DefaultPreloadManager, che precarica i contenuti multimediali per la tua app in base alla strategia che scegli.

I gestori del precaricamento basati sulla classe astratta BasePreloadManager ti consentono di classificare i contenuti in base ai criteri che scegli. Questo documento spiega come utilizzare la classe derivata DefaultPreloadManager, in cui ogni elemento multimediale viene classificato con un numero intero che rappresenta la sua posizione in un elenco (ad esempio, la sua posizione in un carosello di video). Il gestore del precaricamento assegna la priorità al caricamento degli elementi in base alla loro vicinanza all'elemento attualmente riprodotto dall'utente. In questo modo, se un utente passa a un altro elemento, la riproduzione del nuovo elemento può iniziare immediatamente.

Per creare un'istanza di DefaultPreloadManager sono necessari tre passaggi:

  • Definisci un TargetPreloadStatusControl che il gestore del precaricamento può interrogare per scoprire se l'elemento multimediale è pronto per essere caricato e quanto deve essere caricato.
  • Crea il builder che utilizzerai per creare il gestore del precaricamento e gli oggetti ExoPlayer della tua app.
  • Utilizza il builder per creare il gestore del precaricamento chiamando il metodo build() del builder.

Creare un controllo dello stato di precaricamento di destinazione

Quando crei DefaultPreloadManager.Builder, gli passi un oggetto controllo dello stato di precaricamento di destinazione che definisci. Questo oggetto implementa l'interfaccia TargetPreloadStatusControl. Quando il gestore del precaricamento si prepara a precaricare i contenuti multimediali, chiama il metodo getTargetPreloadStatus() del controllo dello stato per scoprire quanti contenuti caricare. Il controllo dello stato può rispondere con uno dei seguenti codici di stato:

  • STAGE_SPECIFIED_RANGE_LOADED: il gestore del precaricamento deve caricare i contenuti dalla posizione iniziale specificata e per la durata specificata (in millisecondi).
  • STAGE_TRACKS_SELECTED: il gestore del precaricamento deve caricare ed elaborare le informazioni della traccia di contenuti e selezionare le tracce. Il gestore del precaricamento non deve ancora iniziare a caricare i contenuti.
  • STAGE_SOURCE_PREPARED: il gestore del precaricamento deve preparare l'origine dei contenuti. Ad esempio, se i metadati dei contenuti si trovano in un file manifest separato, il gestore del precaricamento potrebbe recuperare e analizzare il manifest.
  • null: il gestore del precaricamento non deve caricare contenuti o metadati per l'elemento multimediale.

Dovrai avere una strategia per decidere quanti contenuti caricare per ogni elemento multimediale. In questo esempio, vengono caricati più contenuti per gli elementi più vicini all'elemento attualmente riprodotto. Se l'utente sta riproducendo contenuti con indice n, il controller restituisce i seguenti codici:

  • Indice n+1 (l'elemento multimediale successivo): carica 3000 ms (3 secondi) dalla posizione iniziale predefinita
  • Indice n-1 (l'elemento multimediale precedente): carica 1000 ms (1 secondo) dalla posizione iniziale predefinita
  • Altri elementi multimediali nell'intervallo n-2 a n+2: restituisci PreloadStatus.TRACKS_SELECTED
  • Altri elementi multimediali nell'intervallo n-4 a n+4: Restituisci PreloadStatus.SOURCE_PREPARED
  • Per tutti gli altri elementi multimediali, restituisci null

class MyTargetPreloadStatusControl(var currentPlayingIndex: Int = 0) :
  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.PRELOAD_STATUS_TRACKS_SELECTED
    } else if (abs(index - currentPlayingIndex) <= 4) {
      // return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED
      return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_SOURCE_PREPARED
    }
    return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_NOT_PRELOADED
  }
}

Punti chiave sul codice

  • Quando crei il builder del gestore del precaricamento, gli passi un'istanza di MyTargetPreloadStatusControl.
  • currentPlayingIndex contiene l'indice dell'elemento multimediale attualmente riprodotto. È compito dell'app mantenere aggiornato questo valore.
  • Quando il gestore del precaricamento è pronto per caricare i contenuti, chiama getTargetPreloadStatus e passa le informazioni di ranking specificate per l'elemento multimediale corrispondente. Nel caso di DefaultPreloadManager, queste informazioni di ranking sono un numero intero che specifica la posizione dell'elemento in un carosello. Il metodo sceglie il codice da restituire confrontando l'indice con l'indice dell'elemento attualmente selezionato.

Creare il gestore del precaricamento

Per creare il gestore del precaricamento, devi utilizzare DefaultPreloadManager.Builder. Questo builder è configurato con il contesto corrente e il controllo dello stato di precaricamento di destinazione dell'app. Il builder fornisce anche metodi setter che puoi utilizzare per impostare i componenti personalizzati del gestore del precaricamento.

Oltre a utilizzare il builder per creare il gestore del precaricamento, lo utilizzerai anche per creare gli ExoPlayer oggetti che la tua app utilizza per riprodurre i contenuti.

val targetPreloadStatusControl = MyTargetPreloadStatusControl()
val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl)
val preloadManager = preloadManagerBuilder.build()

Punti chiave sul codice