借助预加载管理器,您可以更快地向用户提供内容,减少用户在从一个项目切换到另一个项目时的等待时间,从而提升用户体验。您还可以自定义每个商品的预加载时长和排名。
社交媒体中常见的情况是,应用会向用户显示媒体选项的列表或轮播界面。例如,应用可能会显示一个短视频轮播界面。 当一个视频播放完毕后,应用会切换到下一个视频。如果用户不喜欢正在观看的视频,可能会滑动到下一个视频或上一个视频。
如果您不预加载视频内容,可能会导致用户体验不佳。用户看完一些媒体内容后,必须等待下一个媒体内容加载。
另一方面,如果您过于激进地预加载内容,则会浪费电量和网络带宽来加载用户可能永远不会实际播放的内容。
DefaultPreloadManager
可帮助您的应用平衡这些问题。预加载管理器会与您的应用协同工作,以确定每个媒体项的重要性,并提前加载适当的量。
劳动分工
如果您使用 DefaultPreloadManager
,则部分工作由您的代码完成,部分工作由预加载管理器完成。
您的应用必须执行以下操作:
- 使用用于创建预加载管理器的同一
DefaultPreloadManager.Builder
对象来创建应用的ExoPlayer
对象。调用DefaultPreloadManager.Builder.buildExoPlayer()
以创建ExoPlayer
。 - 告知预加载管理器应跟踪的每项媒体内容。 这可能不是轮播界面中的所有内容;相反,您只需告知它要播放的前几项内容即可。当用户在轮播界面中浏览时,您可以向预加载管理器的池中添加媒体项和从中移除媒体项。
- 当轮播界面中的内容发生变化,或者用户更改了正在播放的项时,使预加载管理器中的优先级失效。这会告知预加载管理器重新确定每个媒体项的优先级,并在必要时加载内容。您会在首次添加媒体项后使预加载管理器失效,也会在用户从一个项移到另一个项时,或者在您向轮播界面添加项或从中移除项时使预加载管理器失效。
- 响应来自预加载管理器的查询,告知管理器每个商品要预加载多少内容。
当用户开始播放某个项目时,从预加载管理器中提取媒体。预加载管理器会为您的应用提供相应内容的
MediaSource
。使用完毕后,请释放预加载管理器,以释放其资源。
预加载管理器会执行以下操作:
- 它会跟踪您的应用已添加到其中的所有媒体项。
- 每次其优先级失效时,它都会通过调用您的应用实现的
TargetPreloadStatusControl
来查询您的应用。它会调用此方法来了解要加载每个媒体项的数量。 - 在查询应用后,它会预加载适当数量的每种媒体项。预加载管理器会决定加载商品的顺序。它会优先显示与用户正在播放的商品最接近的商品。
- 当应用请求内容时,预加载管理器会提供一个
MediaSource
,其中包含已加载的任何内容。
预加载管理器工作流
本部分介绍了使用预加载管理器的应用的典型工作流。在此示例中,我们假设应用显示一个短视频轮播界面。 所选视频会自动播放,但用户可以向任一方向滚动轮播界面,这会停止正在播放的视频,并开始播放滚动到的视频。
以下页面将详细讨论所有这些步骤。
- 应用创建 目标预加载状态控制。预加载管理器会查询此控件,以确定要加载多少媒体项。
- 应用会创建一个
DefaultPreloadManager.Builder
,并传递目标预加载状态控制。然后,应用使用构建器创建预加载管理器。 - 应用将媒体内容添加到预加载管理器。应用会为每个商品提供一个索引,用于指定商品在轮播界面中的位置。
- 添加所有媒体后,应用会调用
invalidate()
来告知预加载管理器为每个项设置优先级,然后预加载这些项。 - 对于每项媒体内容,预加载管理器都会调用目标预加载控件,以查询应加载多少内容。目标预加载控制可能会指示加载特定时长的内容、仅提取商品的元数据,或者暂时不提取该商品的任何内容。预加载管理器获取此信息后,便会开始加载媒体内容。
- 当用户开始播放内容时,应用会调用预加载管理器,以请求相应媒体项的
MediaSource
。应用还会调用setCurrentPlayingIndex()
来告知预加载管理器正在播放哪个媒体项。 - 如果用户移至其他媒体项,应用会从预加载管理器请求该项,并更新当前播放索引。然后,它会再次调用
invalidate()
,以告知预加载管理器根据当前播放的内容更新其优先级。 - 如果应用向轮播界面添加或从中移除媒体项,它也会向预加载管理器添加或从中移除这些项,并在完成此操作后调用
invalidate()
。 - 每当预加载管理器的优先级失效时,它都会再次调用目标预加载控件,以确定要加载每个项目的多少。
- 当应用关闭轮播界面时,它会释放预加载管理器以释放其资源。