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
TargetPreloadStatusControlche 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
ExoPlayerdella 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. currentPlayingIndexcontiene 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
getTargetPreloadStatuse passa le informazioni di ranking specificate per l'elemento multimediale corrispondente. Nel caso diDefaultPreloadManager, 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
MyTargetPreloadStatusControlè la classe che hai definito in Creare un controllo dello stato di precaricamento di destinazione.- Utilizzerai lo stesso
DefaultPreloadManager.Builderper creare gli oggettiExoPlayerche riprodurranno i contenuti gestiti da questo gestore del precaricamento.