Inhalte verwalten und abspielen

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

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.
  • preloadManager ist der DefaultPreloadManager, der in Create a DefaultPreloadManager erstellt wurde. Der Code ruft die Methode add() dieses Managers auf, um jedes Element im Karussell hinzuzufügen.
  • rankingData ist ein Wert, mit dem der Preload-Manager die Priorität der einzelnen Media-Elemente bestimmt. 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 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 Sie invalidate() 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

  • player ist der Media3 ExoPlayer, mit dem die App die Inhalte wiedergibt. Sie müssen diesen Player erstellen, indem Sie DefaultPreloadManager.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 ein mediaItem sein, 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 eine MediaSource zurü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 setCurrentPlayingIndex auf, 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 Sie invalidate() 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

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.Builder und verwenden Sie ihn, um den DefaultPreloadManager zu erstellen. Versuchen Sie nicht, den alten Builder wiederzuverwenden.