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 al gestore del precaricamento
- Invalidare le priorità nel gestore del precaricamento
- Recuperare e riprodurre contenuti multimediali
- Rimuovere elementi da Gestore precaricamento
- Rilasciare il gestore del precaricamento quando hai finito di utilizzarlo
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 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 comporta di per sé l'avvio del caricamento dei contenuti da parte del gestore del precaricamento. 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 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 fino a 20 elementi. preloadManagerè ilDefaultPreloadManagercreato in Crea unDefaultPreloadManager. Il codice chiama il metodoadd()del gestore per aggiungere ogni elemento nel carosello.rankingDataè un valore utilizzato dal gestore del precaricamento per determinare la priorità di ogni elemento multimediale. PerDefaultPreloadManager,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 il gestore del precaricamento e avviare il precaricamento dei contenuti, devi chiamare
invalidate() per comunicare al gestore del precaricamento che le priorità degli elementi non sono
aggiornate. Devi farlo nelle seguenti situazioni:
- Quando aggiungi o rimuovi nuovi elementi multimediali dal gestore del precaricamento.
Se stai aggiungendo o rimuovendo 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, questo chiama la
TargetPreloadStatusControl che hai creato per scoprire la quantità di contenuti
da caricare da ogni elemento. Dopodiché carica 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 al gestore del precaricamento, devi completarle prima di chiamareinvalidate().
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 parte dei contenuti, la riproduzione è più veloce rispetto a quando non viene utilizzato il gestore del precaricamento. Se il gestore del precaricamento non ha ancora caricato i contenuti dell'elemento, i contenuti 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) } else { // If mediaSource is null, that mediaItem hasn't been added to the preload manager // yet. So, send it directly to the player when it's about to play player.setMediaItem(mediaItem) } 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è Media3ExoPlayerche l'app utilizza per riprodurre i contenuti. Devi creare il player chiamandoDefaultPreloadManager.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 unmediaItemche hai già aggiunto al gestore del precaricamento. Va bene se il gestore del precaricamento non ha ancora iniziato a caricare i contenuti; in questo caso, restituisce unMediaSourceche 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
setCurrentPlayingIndexper 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, chiamainvalidate()per fare in modo che il gestore del precaricamento determini nuovamente la priorità di 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 articoli rimossi, puoi sempre aggiungerli di nuovo.
preloadManager.remove(mediaItem)
Punti chiave del 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, devi aggiungerne di nuovi al gestore del precaricamento e poi invalidare le priorità nel 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 distrutta.
preloadManager.release()
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.Buildere utilizzalo per creare ilDefaultPreloadManager. Non provare a riutilizzare il vecchio generatore.