Gestire e riprodurre contenuti

Questa pagina descrive come utilizzare un gestore del precaricamento per gestire i contenuti video. Utilizzando un gestore del precaricamento, puoi offrire all'utente un'esperienza migliore: quando l'utente passa da un elemento multimediale all'altro, la riproduzione inizia più velocemente perché il gestore ha già caricato parte dei contenuti.

Questa pagina tratta i seguenti argomenti:

Aggiungere elementi multimediali a Gestione precaricamento

Devi comunicare al gestore del precaricamento ogni elemento multimediale che verrà monitorato. Ad esempio, se la tua app ha un carosello di video, devi aggiungerli a preload manager. A seconda del caso d'uso, puoi aggiungere tutti i video o solo quelli vicini al video attualmente in riproduzione. Puoi anche aggiungere nuovi elementi al gestore del precaricamento in un secondo momento.

L'aggiunta degli elementi multimediali non fa sì che il gestore del precaricamento inizi a caricare i contenuti. Per attivare il precaricamento, devi invalidare le priorità in Gestione precaricamento.

val initialMediaItems = pullMediaItemsFromService(/* count= */ 20);
for (index in 0 until initialMediaItems.size) {
  preloadManager.add(initialMediaItems.get(index), /* rankingData= */ index)
}
// items aren't actually loaded yet! need to call invalidate() after this

Punti chiave del codice

  • Questo snippet mostra come popolare inizialmente il gestore del precaricamento dopo averlo creato. Puoi anche chiamare il numero add() per aggiungere elementi a un preload manager esistente e compilato.
  • In questo snippet, pullMediaItemsFromService() è la logica dell'app per recuperare l'elenco dei contenuti da riprodurre. Il codice chiama questo metodo per recuperare un elenco di fino a 20 elementi.
  • preloadManager è il DefaultPreloadManager creato in Crea un DefaultPreloadManager. Il codice chiama il metodo add() del gestore per aggiungere ogni elemento nel carosello.
  • rankingData è un valore utilizzato dal gestore del precaricamento per determinare la priorità di ogni elemento multimediale. Per DefaultPreloadManager, rankingData è un numero intero che rappresenta la posizione dell'elemento nel carosello. Il gestore del precaricamento determina la priorità in base alla distanza di ogni elemento dall'elemento in riproduzione.

Invalidare le priorità nel gestore del precaricamento

Per attivare la gestione del precaricamento e avviare il precaricamento dei contenuti, devi chiamare invalidate() per comunicare alla gestione del precaricamento che le priorità degli elementi non sono aggiornate. Devi farlo nelle seguenti situazioni:

  • Quando aggiungi o rimuovi nuovi elementi multimediali nel Gestore precaricamento. Se aggiungi o rimuovi più elementi, devi aggiungerli tutti, poi chiama invalidate().
  • Quando l'utente passa da un elemento multimediale a un altro. In questo caso, devi assicurarti di aggiornare l'indice di riproduzione corrente prima di chiamare invalidate(), come descritto in Recuperare e riprodurre contenuti.

Quando invalidi il gestore del precaricamento, chiama la TargetPreloadStatusControl che hai creato per scoprire la quantità di contenuti da caricare da ogni elemento. Carica quindi i contenuti di ogni elemento in ordine di priorità, da quella più alta a quella più bassa.

preloadManager.invalidate()

Punti chiave del codice

  • La chiamata di invalidate() attiva il gestore del precaricamento per rivalutare la priorità di ogni elemento multimediale che conosce. Per questo motivo, se stai apportando molte modifiche a Gestione precaricamento, devi completarle prima di chiamare invalidate().

Recuperare e riprodurre contenuti multimediali

Quando l'utente passa a un nuovo elemento multimediale, devi recuperarlo dal gestore del precaricamento. Se il gestore del precaricamento ha caricato alcuni contenuti, la riproduzione è più veloce rispetto a quanto sarebbe stata se non avessi utilizzato il gestore del precaricamento. Se il gestore del precaricamento non ha ancora caricato i contenuti dell'elemento, questi vengono riprodotti normalmente.

// When a media item is about to display on the screen
val mediaSource = preloadManager.getMediaSource(mediaItem)
if (mediaSource != null) {
    player.setMediaSource(mediaSource)
}
player.prepare()

// When the media item is displaying at the center of the screen
player.play()
preloadManager.setCurrentPlayingIndex(currentIndex)

// Need to call invalidate() to update the priorities
preloadManager.invalidate()

Punti chiave del codice

  • player è Media3 ExoPlayer che l'app utilizza per riprodurre i contenuti. Devi creare il player chiamando DefaultPreloadManager.Builder.buildExoPlayer() nello stesso builder che hai utilizzato per creare il gestore del precaricamento.
  • Quando l'utente passa a un nuovo elemento multimediale, l'app chiama getMediaSource() per ottenere l'origine multimediale dal gestore del precaricamento. Deve essere un mediaItem che hai già aggiunto a Gestione precaricamento. Va bene se il gestore del precaricamento non ha ancora iniziato a caricare i contenuti; in questo caso, restituisce un MediaSource che non contiene dati precaricati. Ad esempio, questo potrebbe accadere se l'utente avanza improvvisamente di molto nel carosello.
  • Dopo che l'utente ha riprodotto il nuovo elemento multimediale, chiama setCurrentPlayingIndex per comunicare al gestore del precaricamento la posizione del nuovo elemento nel carosello. Il gestore del precaricamento ha bisogno di queste informazioni per dare la priorità al caricamento dell'elemento successivo. Dopo aver aggiornato l'indice corrente, chiama invalidate() per fare in modo che il gestore del precaricamento determini nuovamente la priorità per ogni elemento.

Rimuovere elementi da Gestore precaricamento

Per mantenere efficiente il gestore del precaricamento, devi rimuovere gli elementi che non devono più essere monitorati. Potresti anche rimuovere gli elementi ancora presenti nel carosello, ma lontani dalla posizione attuale dell'utente. Ad esempio, potresti decidere che se un elemento dista più di 15 elementi da quello che l'utente sta guardando, non è necessario precaricarlo. In questo caso, rimuoveresti gli elementi quando si allontanano troppo. Se l'utente torna a interessarsi agli elementi rimossi, puoi sempre aggiungerli di nuovo.

preloadManager.remove(mediaItem)

Punti chiave del codice

Rilascia il gestore del precaricamento quando hai finito

Quando non hai più bisogno del gestore del precaricamento, devi rilasciarlo per liberare le sue risorse. In particolare, assicurati di rilasciarlo quando la tua attività viene distrutta.

preloadManager.release()

Punti chiave del codice

  • Non devi chiamare nessuno dei metodi dell'oggetto dopo averlo rilasciato.
  • Se devi creare un altro gestore del precaricamento, crea un nuovo DefaultPreloadManager.Builder e utilizzalo per creare il DefaultPreloadManager. Non tentare di riutilizzare il vecchio generatore.