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 a un altro, la riproduzione inizia più velocemente perché il gestore ha già caricato alcuni dei contenuti.

Questa pagina tratta i seguenti argomenti:

Aggiungere elementi multimediali al gestore del precaricamento

Devi comunicare al gestore del precaricamento ogni elemento multimediale da monitorare. Ad esempio, se la tua app ha un carosello di video, devi aggiungerli al gestore del precaricamento. A seconda del caso d'uso, potresti 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.

Per farlo, utilizza un metodo di aggiunta batch come addMediaItems. In alternativa, puoi chiamare add (o addMediaSource) per aggiungere gli elementi multimediali singolarmente. Tuttavia, l'aggiunta di elementi multimediali singolarmente non attiva automaticamente il precaricamento. Quando utilizzi i metodi individuali, devi chiamare esplicitamente invalidate una volta terminata l'aggiunta degli elementi per indicare al gestore del precaricamento di aggiornare le priorità e avviare il precaricamento.

val initialMediaItems = pullMediaItemsFromService(count = 20)
val rankingDataList = initialMediaItems.indices.toList()
preloadManager.addMediaItems(initialMediaItems, rankingDataList)

Punti chiave sul codice

  • Questo snippet mostra come popolare inizialmente il gestore del precaricamento in modalità batch dopo averlo creato. Puoi chiamare addMediaItems per aggiungere elementi a un gestore del precaricamento esistente e popolato.
  • 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 massimo 20 elementi.
  • preloadManager è il DefaultPreloadManager creato in Creare un DefaultPreloadManager.
  • 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 attualmente in riproduzione.

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 dei contenuti, questi vengono riprodotti più velocemente rispetto a quanto sarebbe accaduto se non avessi utilizzato il gestore del precaricamento. Se il gestore del precaricamento non ha ancora caricato i contenuti di questo elemento, questi vengono riprodotti normalmente.

Devi anche aggiornare l'indice di riproduzione corrente nel gestore del precaricamento chiamando setCurrentPlayingIndex, che consente al gestore del precaricamento di determinare le priorità delle future operazioni di precaricamento.

// When a media item is about to be displayed on the screen
val mediaSource = preloadManager.getMediaSource(mediaItem)
if (mediaSource != null) {
  player.setMediaSource(mediaSource)
} else {
  // If the mediaSource is null, its mediaItem hasn't been added to the preload
  // manager yet. Send it directly to the player when it's about to play.
  player.setMediaItem(mediaItem)
}
player.prepare()

// When the media item is being displayed at the center of the screen ("in focus")
player.play()
// Update the current playing index to let the preload manager know where the user
// is in the carousel/pagination/list.
preloadManager.setCurrentPlayingIndex(currentIndex)

Punti chiave sul codice

  • player è l'ExoPlayer Media3 che l'app utilizza per riprodurre i contenuti. Devi creare questo player chiamando DefaultPreloadManager.Builder.buildExoPlayer() sullo 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 recuperare l'origine multimediale dal gestore del precaricamento. Deve trattarsi di un mediaItem che hai già aggiunto al gestore del precaricamento. Non è un problema 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 salta improvvisamente molto avanti nel carosello.
  • Dopo che l'utente ha riprodotto il nuovo elemento multimediale, chiama setCurrentPlayingIndex per indicare 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.

Rimuovere elementi dal gestore del precaricamento

Per mantenere efficiente il gestore del precaricamento, devi rimuovere gli elementi che non deve più monitorare. Potresti anche rimuovere gli elementi ancora presenti nel carosello, ma lontani dalla posizione attuale dell'utente. Ad esempio, potresti decidere che se un elemento è a più di 15 elementi di distanza da quello che l'utente sta guardando, non è necessario precaricarlo. In questo caso, rimuovi gli elementi quando si trovano a questa distanza. Se l'utente torna verso gli elementi rimossi, puoi sempre aggiungerli di nuovo.

Se hai un elenco di elementi multimediali da rimuovere, puoi utilizzare removeMediaItems. In alternativa, puoi chiamare remove (o removeMediaSource) per rimuovere gli elementi multimediali singolarmente.

preloadManager.removeMediaItems(mediaItemsToRemove)

Punti chiave sul codice

  • Se vuoi rimuovere tutti gli elementi dal gestore del precaricamento, puoi chiamare reset() anziché remove(). Questo approccio è utile se devi modificare tutti gli elementi del carosello. In questo caso, dopo aver rimosso gli elementi, dovrai aggiungerne di nuovi al gestore del precaricamento.

Rilasciare il gestore del precaricamento quando hai finito di utilizzarlo

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 eliminata.

preloadManager.release()

Punti chiave sul 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 provare a riutilizzare il vecchio builder.