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:

Medienelemente 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 Videos 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.

Durch das Hinzufügen der Media-Elemente wird der Preload Manager nicht automatisch dazu veranlasst, die Inhalte zu laden. Damit die Vorabladung ausgelöst wird, 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.get(index), /* rankingData= */ index)
}
// items aren't actually loaded yet! need to call invalidate() after this

Wichtige Punkte zum Code

  • In diesem Snippet sehen Sie, wie Sie den Preload-Manager nach der Erstellung initial befüllen. Sie können auch add() 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 abzuspielenden 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. Mit dem Code wird die add()-Methode des Managers aufgerufen, 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 jedes Elements 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 nicht mehr aktuell sind. Sie sollten dies 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 Elemente hinzufügen, bevor Sie invalidate() aufrufen.
  • Wenn der Nutzer von einem Media-Element zu einem anderen wechselt. In diesem Fall müssen Sie den aktuellen Wiedergabeindex aktualisieren, bevor Sie invalidate() aufrufen, wie unter Inhalte abrufen und wiedergeben beschrieben.

Wenn Sie den Preload-Manager ungültig machen, wird die von Ihnen erstellte TargetPreloadStatusControl aufgerufen, um herauszufinden, wie viele Inhalte für die einzelnen Elemente geladen werden sollen. Anschließend werden die Inhalte für die einzelnen Elemente in der Reihenfolge ihrer Priorität geladen, von hoch nach niedrig.

preloadManager.invalidate()

Wichtige Punkte zum Code

  • Durch den Aufruf von invalidate() wird der Preload-Manager veranlasst, die Priorität jedes ihm bekannten Media-Elements neu zu bewerten. Wenn Sie viele Änderungen am Preload-Manager vornehmen, sollten Sie diese daher abschließen, bevor Sie invalidate() aufrufen.

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

// When a media item is about to display on the screen
val mediaSource = preloadManager.getMediaSource(mediaItem)
if (mediaSource != null) {
    player.setMediaSource(mediaSource)
}
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 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. 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 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.

preloadManager.remove(mediaItem)

Wichtige Punkte zum Code

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.