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 zum Preload-Manager hinzufügen
- Prioritäten im Preload-Manager ungültig machen
- Medien abrufen und abspielen
- Elemente aus dem Preload-Manager entfernen
- Vorab-Download-Manager freigeben, wenn Sie ihn nicht mehr benötigen
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 dieDefaultPreloadManager
, die inDefaultPreloadManager
erstellen erstellt wurde. Mit dem Code wird dieadd()
-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ürDefaultPreloadManager
istrankingData
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 Sieinvalidate()
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 SieDefaultPreloadManager.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 einmediaItem
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 einMediaSource
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 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 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
- 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 zum Preload Manager hinzufügen und dann die Prioritäten im Preload Manager ungültig machen.
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 desDefaultPreloadManager
. Versuchen Sie nicht, den alten Builder wiederzuverwenden.