Gérer et lire des contenus

Cette page explique comment utiliser un gestionnaire de préchargement pour gérer le contenu vidéo. En utilisant un gestionnaire de préchargement, vous pouvez offrir une meilleure expérience à l'utilisateur. Lorsqu'il passe d'un élément multimédia à un autre, la lecture démarre plus rapidement, car le gestionnaire a déjà chargé une partie du contenu.

Cette page aborde les sujets suivants :

Ajouter des éléments multimédias au gestionnaire de préchargement

Vous devez indiquer au gestionnaire de préchargement chaque élément multimédia qu'il suivra. Par exemple, si votre application comporte un carrousel de vidéos, vous devez les ajouter au gestionnaire de préchargement. Selon votre cas d'utilisation, vous pouvez ajouter toutes les vidéos ou uniquement celles qui se trouvent à proximité de la vidéo en cours de lecture. Vous pouvez également ajouter de nouveaux éléments au gestionnaire de préchargement ultérieurement.

Pour ce faire, utilisez une méthode d'ajout par lot comme addMediaItems. Vous pouvez également appeler add (ou addMediaSource) pour ajouter des éléments multimédias individuellement. Toutefois, l'ajout d'éléments multimédias individuels ne déclenche pas automatiquement le préchargement. Lorsque vous utilisez des méthodes individuelles, vous devez appeler explicitement invalidate une fois que vous avez terminé d'ajouter des éléments pour indiquer au gestionnaire de préchargement de mettre à jour les priorités et de commencer le préchargement.

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

Points clés concernant le code

  • Cet extrait montre comment remplir initialement le gestionnaire de préchargement en mode batch après l'avoir créé. Vous pouvez appeler addMediaItems pour ajouter des éléments à un gestionnaire de préchargement existant et rempli.
  • Dans cet extrait, pullMediaItemsFromService() correspond à la logique de l'application pour récupérer la liste des contenus à lire. Le code appelle cette méthode pour récupérer une liste de 20 éléments maximum.
  • preloadManager est la DefaultPreloadManager créée dans Créer une DefaultPreloadManager.
  • rankingData est une valeur utilisée par le gestionnaire de préchargement pour déterminer la priorité de chaque élément multimédia. Pour DefaultPreloadManager, rankingData est un entier représentant la position de l'élément dans le carrousel. Le gestionnaire de préchargement détermine la priorité en fonction de la distance entre chaque élément et celui en cours de lecture.

Récupérer et lire des contenus multimédias

Lorsque l'utilisateur passe à un nouvel élément multimédia, vous devez l'obtenir auprès du gestionnaire de préchargement. Si le gestionnaire de préchargement a chargé du contenu, celui-ci est lu plus rapidement que si vous ne l'aviez pas utilisé. Si le gestionnaire de préchargement n'a pas encore chargé le contenu de cet élément, il est lu normalement.

Vous devez également mettre à jour l'index de lecture actuel dans le gestionnaire de préchargement en appelant setCurrentPlayingIndex. Cela permet au gestionnaire de préchargement de déterminer les priorités des futures opérations de préchargement.

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

Points clés concernant le code

  • player est le ExoPlayer Media3 que l'application utilise pour lire le contenu. Vous devez créer ce lecteur en appelant DefaultPreloadManager.Builder.buildExoPlayer() sur le même générateur que celui utilisé pour créer le gestionnaire de préchargement.
  • Lorsque l'utilisateur passe à un nouvel élément multimédia, l'application appelle getMediaSource() pour obtenir la source multimédia du gestionnaire de préchargement. Il doit s'agir d'un mediaItem que vous avez déjà ajouté au gestionnaire de préchargement. Ce n'est pas un problème si le gestionnaire de préchargement n'a pas encore commencé à charger le contenu. Dans ce cas, il renvoie un MediaSource qui ne contient pas de données préchargées. Par exemple, cela peut se produire si l'utilisateur passe soudainement loin en avant dans le carrousel.
  • Une fois que l'utilisateur a lu le nouvel élément multimédia, appelez setCurrentPlayingIndex pour indiquer au gestionnaire de préchargement où se trouve le nouvel élément dans le carrousel. Le gestionnaire de préchargement a besoin de ces informations pour prioriser le chargement de l'élément suivant.

Supprimer des éléments du gestionnaire de préchargement

Pour que le gestionnaire de préchargement reste efficace, vous devez supprimer les éléments qu'il n'a plus besoin de suivre. Vous pouvez également supprimer les éléments qui se trouvent toujours dans le carrousel, mais qui sont loin de la position actuelle de l'utilisateur. Par exemple, vous pouvez décider qu'un élément n'a pas besoin d'être préchargé s'il se trouve à plus de 15 éléments de ce que l'utilisateur regarde. Dans ce cas, vous supprimeriez les éléments lorsqu'ils seraient aussi éloignés. Si l'utilisateur revient vers les éléments supprimés, vous pouvez toujours les rajouter.

Si vous avez une liste d'éléments multimédias à supprimer, vous pouvez utiliser removeMediaItems. Vous pouvez également appeler remove (ou removeMediaSource) pour supprimer des éléments multimédias individuellement.

preloadManager.removeMediaItems(mediaItemsToRemove)

Points clés concernant le code

  • Si vous souhaitez supprimer tous les éléments du gestionnaire de préchargement, vous pouvez appeler reset() au lieu de remove(). Cette approche est utile si vous devez modifier tous les éléments de votre carrousel. Dans ce cas, après avoir supprimé les éléments, vous devrez en ajouter de nouveaux au gestionnaire de préchargement.

Libérer le gestionnaire de préchargement lorsque vous n'en avez plus besoin

Lorsque vous n'avez plus besoin du gestionnaire de préchargement, vous devez le libérer pour libérer ses ressources. En particulier, veillez à le libérer lorsque votre activité est détruite.

preloadManager.release()

Points clés concernant le code

  • Vous ne devez pas appeler les méthodes de l'objet après l'avoir libéré.
  • Si vous devez créer un autre gestionnaire de préchargement, créez un DefaultPreloadManager.Builder et utilisez-le pour créer le DefaultPreloadManager. N'essayez pas de réutiliser l'ancien outil de création.