Inhalte verwalten und abspielen

Auf dieser Seite wird beschrieben, wie Sie einen Preload-Manager zum Verwalten von Videoinhalten verwenden. 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 dem Preload-Manager hinzufügen

Sie müssen dem Preload-Manager jedes Media-Element mitteilen, das er erfassen soll. Wenn Ihre App beispielsweise ein Karussell mit Videos enthält, fügen Sie diese dem Preload-Manager hinzu. Je nach Anwendungsfall können Sie alle Videos oder nur alle Videos in der Nähe des aktuell wiedergegebenen Videos hinzufügen. Sie können dem Preload-Manager auch später neue Elemente hinzufügen.

Verwenden Sie dazu eine Methode zum Hinzufügen von mehreren Elementen gleichzeitig, z. B. addMediaItems. Alternativ können Sie add (oder addMediaSource) aufrufen, um Media-Elemente einzeln hinzuzufügen. Wenn Sie jedoch Media-Elemente einzeln hinzufügen, wird das Vorabladen nicht automatisch ausgelöst. Wenn Sie einzelne Methoden verwenden, müssen Sie invalidate explizit aufrufen, sobald Sie alle Elemente hinzugefügt haben. So wird der Preload-Manager angewiesen, Prioritäten zu aktualisieren und mit dem Preloading zu beginnen.

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

Wichtige Punkte zum Code

  • In diesem Snippet sehen Sie, wie Sie den Preload-Manager im Batchmodus initialisieren, nachdem Sie ihn erstellt haben. Sie können addMediaItems aufrufen, um einem vorhandenen, gefüllten Preload-Manager Elemente hinzuzufügen.
  • In diesem Snippet ist pullMediaItemsFromService() die Logik der App zum Abrufen der Liste der wiederzugebenden Inhalte. Der Code ruft diese Methode auf, um eine Liste mit bis zu 20 Elementen abzurufen.
  • preloadManager ist die DefaultPreloadManager, die in DefaultPreloadManager erstellen erstellt wurde.
  • rankingData ist ein Wert, den der Preload-Manager verwendet, um die Priorität der einzelnen Media-Elemente zu bestimmen. Für DefaultPreloadManager ist rankingData eine Ganzzahl, die die Position des Elements im Karussell darstellt. Der Preload-Manager bestimmt die Priorität anhand der Entfernung jedes Elements vom aktuell wiedergegebenen Element.

Medien abrufen und wiedergeben

Wenn der Nutzer zu einem neuen Medienelement wechselt, müssen Sie das Medienelement vom Preload-Manager abrufen. Wenn der Preload-Manager Inhalte geladen hat, werden diese schneller wiedergegeben, als wenn Sie den Preload-Manager nicht verwendet hätten. Wenn der Preload-Manager noch keine Inhalte für diesen Artikel geladen hat, werden die Inhalte normal wiedergegeben.

Außerdem müssen Sie den aktuellen Wiedergabeindex im Preload-Manager aktualisieren, indem Sie setCurrentPlayingIndex aufrufen. So kann der Preload-Manager die Prioritäten zukünftiger Preload-Vorgänge festlegen.

// 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)

Wichtige Punkte zum Code

  • player ist die Media3-ExoPlayer, die die App zum Abspielen der Inhalte verwendet. Sie müssen diesen Player erstellen, indem Sie DefaultPreloadManager.Builder.buildExoPlayer() für denselben Builder aufrufen, den Sie zum Erstellen des Preload-Managers verwendet haben.
  • Wenn der Nutzer zu einem neuen Media-Element wechselt, ruft die App getMediaSource() auf, um die Media-Quelle vom Preload-Manager abzurufen. Es muss sich um ein mediaItem handeln, 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 ein MediaSource ohne vorab geladene Daten zurückgegeben. Das kann beispielsweise passieren, wenn der Nutzer im Karussell plötzlich weit nach vorn springt.
  • Nachdem der Nutzer das neue Medienelement abgespielt hat, rufen Sie setCurrentPlayingIndex auf, um dem Preload-Manager mitzuteilen, an welcher Stelle im Karussell sich das neue Element befindet. Der Preload-Manager benötigt diese Informationen, um das Laden des nächsten Elements zu priorisieren.

Elemente aus dem Preload-Manager entfernen

Damit der Preload-Manager effizient bleibt, sollten Sie Elemente entfernen, die er nicht mehr nachverfolgen 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 sich der Nutzer wieder in Richtung der entfernten Elemente bewegt, können Sie sie jederzeit wieder hinzufügen.

Wenn Sie eine Liste mit zu entfernenden Media-Elementen haben, können Sie removeMediaItems verwenden. Alternativ können Sie remove (oder removeMediaSource) aufrufen, um einzelne Media-Elemente zu entfernen.

preloadManager.removeMediaItems(mediaItemsToRemove)

Wichtige Punkte zum Code

  • Wenn Sie alle Elemente aus dem Preload-Manager entfernen möchten, können Sie anstelle von remove() reset() aufrufen. Dieser Ansatz ist nützlich, wenn Sie alle Elemente in Ihrem Karussell ändern müssen. In diesem Fall müssen Sie nach dem Entfernen der Elemente neue Elemente in den Preload-Manager einfügen.

Vorab-Download-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. Achten Sie insbesondere darauf, sie freizugeben, wenn Ihre Aktivität zerstört 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 ein neues DefaultPreloadManager.Builder und verwenden Sie es zum Erstellen des DefaultPreloadManager. Versuchen Sie nicht, den alten Builder wiederzuverwenden.