Auf dieser Seite wird beschrieben, wie Sie mit einem Preload-Manager Videoinhalte verwalten. Mit einem Preload-Manager können Sie die Nutzerfreundlichkeit verbessern. Wenn der Nutzer von einem Media-Element zu einem anderen wechselt, beginnt die Wiedergabe schneller, da der Manager bereits einige Inhalte geladen hat.
Auf dieser Seite werden die folgenden Themen behandelt:
- Media-Elemente zum Preload-Manager hinzufügen
- Prioritäten im Preload-Manager ungültig machen
- Medien abrufen und wiedergeben
- Elemente aus dem Preload-Manager entfernen
- Preload-Manager freigeben, wenn Sie ihn nicht mehr benötigen
Media-Elemente zum Preload-Manager hinzufügen
Sie müssen dem Preload-Manager jedes Media-Element mitteilen, das er verfolgen soll. Wenn Ihre App beispielsweise ein Karussell mit Videos enthält, fügen Sie diese Videos dem Preload-Manager hinzu. Je nach Anwendungsfall können Sie alle Videos oder nur die Videos in der Nähe des aktuell wiedergegebenen Videos hinzufügen. Sie können dem Preload-Manager auch später neue Elemente hinzufügen.
Durch das Hinzufügen der Media-Elemente wird der Preload-Manager nicht automatisch dazu veranlasst, die Inhalte zu laden. Um das Vorabladen auszulösen, müssen Sie die Prioritäten im Preload-Manager ungültig machen.
val initialMediaItems = pullMediaItemsFromService(count = 20) for (index in 0 until initialMediaItems.size) { preloadManager.add(initialMediaItems[index], /* rankingData= */ index) } // items aren't actually loaded yet! need to call invalidate() after this
Wichtige Punkte zum Code
- In diesem Snippet wird gezeigt, wie Sie den Preload-Manager nach dem Erstellen anfänglich füllen. Sie können auch
add()aufrufen, um Elemente zu einem vorhandenen, gefüllten Preload-Manager hinzuzufügen. - In diesem Snippet ist
pullMediaItemsFromService()die App-Logik zum Abrufen der Liste der wiederzugebenden Inhalte. Der Code ruft diese Methode auf, um eine Liste mit bis zu 20 Elementen abzurufen. preloadManagerist derDefaultPreloadManager, der in Create aDefaultPreloadManagererstellt wurde. Der Code ruft die Methodeadd()dieses Managers auf, um jedes Element im Karussell hinzuzufügen.rankingDataist ein Wert, mit dem der Preload-Manager die Priorität der einzelnen Media-Elemente bestimmt. FürDefaultPreloadManageristrankingDataeine Ganzzahl, die die Position des Elements im Karussell darstellt. Der Preload-Manager bestimmt die Priorität anhand der Entfernung der einzelnen Elemente vom aktuell wiedergegebenen Element.
Prioritäten im Preload-Manager ungültig machen
Damit der Preload-Manager mit dem Vorabladen von Inhalten beginnt, müssen Sie invalidate() aufrufen, um dem Preload-Manager mitzuteilen, dass die Prioritäten der Elemente veraltet sind. Das sollten Sie in den folgenden Situationen tun:
- Wenn Sie dem Preload-Manager neue Media-Elemente hinzufügen oder Media-Elemente entfernen.
Wenn Sie mehrere Elemente hinzufügen oder entfernen, sollten Sie alle hinzufügen und dann
invalidate()aufrufen. - Wenn der Nutzer von einem Media-Element zu einem anderen wechselt. In diesem Fall sollten Sie den aktuellen Wiedergabeindex aktualisieren, bevor Sie
invalidate()aufrufen, wie unter Inhalte abrufen und wiedergeben beschrieben.
Wenn Sie den Preload-Manager ungültig machen, ruft er den
TargetPreloadStatusControl von Ihnen erstellten auf, um zu ermitteln, wie viele Inhalte
er von jedem Element laden soll. Anschließend werden die Inhalte für jedes Element in der Reihenfolge ihrer Priorität von hoch nach niedrig geladen.
preloadManager.invalidate()
Wichtige Punkte zum Code
- Durch den Aufruf von
invalidate()wird der Preload-Manager dazu veranlasst, die Priorität der einzelnen Media-Elemente neu zu bewerten. Wenn Sie viele Änderungen am Preload-Manager vornehmen, sollten Sie die Änderungen daher abschließen, bevor Sieinvalidate()aufrufen.
Medien abrufen und wiedergeben
Wenn der Nutzer zu einem neuen Media-Element wechselt, müssen Sie das Media-Element vom Preload-Manager abrufen. Wenn der Preload-Manager Inhalte geladen hat, werden die Inhalte schneller wiedergegeben, als wenn Sie den Preload-Manager nicht verwendet hätten. Wenn der Preload-Manager noch keine Inhalte von diesem Element geladen hat, werden die Inhalte normal wiedergegeben.
// 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()
Wichtige Punkte zum Code
playerist der Media3ExoPlayer, mit dem die App die Inhalte wiedergibt. Sie müssen diesen Player erstellen, indem SieDefaultPreloadManager.Builder.buildExoPlayer()für denselben Builder aufrufen, mit dem Sie den Preload-Manager erstellt haben.- Wenn der Nutzer zu einem neuen Media-Element wechselt, ruft die App
getMediaSource()auf, um die Media-Quelle vom Preload-Manager abzurufen. Dies muss einmediaItemsein, das Sie bereits dem Preload-Manager hinzugefügt haben. Es ist in Ordnung, wenn der Preload-Manager noch nicht mit dem Laden der Inhalte begonnen hat. In diesem Fall wird eineMediaSourcezurückgegeben, die keine vorab geladenen Daten enthält. Das kann beispielsweise passieren, wenn der Nutzer plötzlich weit im Karussell nach vorne springt. - Nachdem der Nutzer das neue Media-Element wiedergegeben hat, rufen Sie
setCurrentPlayingIndexauf, um dem Preload-Manager mitzuteilen, wo sich das neue Element im Karussell befindet. Der Preload-Manager benötigt diese Informationen, um das Laden des nächsten Elements zu priorisieren. Nachdem Sie den aktuellen Index aktualisiert haben, rufen Sieinvalidate()auf, damit der Preload-Manager die Priorität für jedes Element neu bestimmt.
Elemente aus dem Preload-Manager entfernen
Damit der Preload-Manager effizient bleibt, sollten Sie Elemente entfernen, die er nicht mehr verfolgen muss. Sie können auch Elemente entfernen, die sich noch im Karussell befinden, aber weit von der aktuellen Position des Nutzers entfernt sind. Sie können beispielsweise festlegen, dass ein Element nicht vorab geladen werden muss, wenn es mehr als 15 Elemente von dem entfernt ist, was der Nutzer gerade ansieht. In diesem Fall würden Sie Elemente entfernen, wenn sie so weit entfernt sind. Wenn der Nutzer sich wieder in Richtung dieser entfernten Elemente bewegt, können Sie sie jederzeit wieder hinzufügen.
preloadManager.remove(mediaItem)
Wichtige Punkte zum Code
- Wenn Sie alle Elemente aus dem Preload-Manager entfernen möchten, können Sie anstelle von
remove()auchreset()aufrufen. Dieser Ansatz ist nützlich, wenn Sie alle Elemente im Karussell ändern müssen. In diesem Fall müssen Sie nach dem Entfernen der Elemente dem Preload-Manager neue Elemente hinzufügen und dann die Prioritäten im Preload-Manager ungültig machen.
Preload-Manager freigeben, wenn Sie ihn nicht mehr benötigen
Wenn Sie den Preload-Manager nicht mehr benötigen, müssen Sie ihn freigeben, um seine Ressourcen freizugeben. Geben Sie ihn insbesondere frei, wenn Ihre Aktivität beendet wird.
preloadManager.release()
Wichtige Punkte zum Code
- Sie dürfen keine Methoden des Objekts aufrufen, nachdem Sie es freigegeben haben.
- Wenn Sie einen weiteren Preload-Manager erstellen müssen, erstellen Sie einen neuen
DefaultPreloadManager.Builderund verwenden Sie ihn, um denDefaultPreloadManagerzu erstellen. Versuchen Sie nicht, den alten Builder wiederzuverwenden.