預先載入管理工具可加快內容放送速度,減少使用者在項目間切換時的等待時間,進而提升使用者體驗。你也可以自訂每個項目的預先載入時間長度和排名。
在社群媒體中,常見的情況是應用程式向使用者顯示媒體選項清單或輪播介面。舉例來說,應用程式可能會顯示短片輪播介面。 當前影片播放完畢後,應用程式會切換至下一部。如果使用者不喜歡觀看的影片,可能會滑動到下一部或上一部影片。
如果沒有預先載入影片內容,可能會導致使用者體驗不佳。使用者看完某些媒體後,必須等待下一個媒體載入。
另一方面,如果過度預先載入內容,可能會浪費電力和網路頻寬,載入使用者可能永遠不會播放的內容。
DefaultPreloadManager
可協助應用程式兼顧這些考量。預先載入管理工具會與應用程式合作,判斷每個媒體項目的重要程度,並預先載入適當的量。
勞動分工
如果您使用 DefaultPreloadManager
,部分工作會由您的程式碼完成,部分則由預先載入管理工具完成。
應用程式必須執行下列操作:
- 使用與建立預先載入管理工具相同的
DefaultPreloadManager.Builder
物件,建立應用程式的ExoPlayer
物件。呼叫DefaultPreloadManager.Builder.buildExoPlayer()
建立ExoPlayer
。 - 將應追蹤的每個媒體項目告知預先載入管理工具。 這可能不是輪轉介面中的所有內容,你只需要告訴它要播放的前幾項內容即可。當使用者瀏覽輪轉介面時,您可以從預先載入管理工具的集區中新增及移除媒體項目。
- 當輪播內容變更,或使用者變更播放的項目時,請在預先載入管理工具中使優先順序失效。這會告知預先載入管理工具重新判斷每個媒體項目的優先順序,並視需要載入內容。您會在首次新增媒體項目後,以及使用者從一個項目移至另一個項目時,或是在輪轉介面中新增或移除項目時,使預先載入管理工具失效。
- 回覆預先載入管理員的查詢,告知管理員每個項目要預先載入多少內容。
使用者開始播放項目時,從預先載入管理工具擷取媒體。預先載入管理工具會為該內容提供應用程式的
MediaSource
。完成後釋放預先載入管理工具,釋出其資源。
預先載入管理工具會執行下列操作:
- 並追蹤應用程式新增至其中的所有媒體項目。
- 每當優先順序失效時,系統就會呼叫應用程式實作的
TargetPreloadStatusControl
查詢應用程式。系統會呼叫這個函式,瞭解要載入每個媒體項目的多少。 - 查詢應用程式後,系統會預先載入適量的每個媒體項目。預先載入管理工具會決定載入項目的順序。系統會優先顯示與使用者正在播放的項目最接近的項目。
- 應用程式要求內容時,預先載入管理工具會提供已載入的內容。
MediaSource
預先載入管理員工作流程
本節說明使用預先載入管理工具的應用程式一般工作流程。在本範例中,我們假設應用程式會顯示短片輪播介面。 選取的影片會自動播放,但使用者可以向任一方向捲動輪轉介面,這時系統會停止播放影片,並開始播放捲動到的影片。
後續頁面將詳細說明所有這些步驟。
- 應用程式會建立 目標預先載入狀態控制項。預先載入管理工具會查詢這項控制項,瞭解要載入多少媒體項目。
- 應用程式會建立
DefaultPreloadManager.Builder
,並傳遞目標預先載入狀態控制項。接著,應用程式會使用建構工具建立預先載入管理員。 - 應用程式會將媒體項目新增至預先載入管理工具。應用程式會為每個項目提供索引,指定項目在輪轉介面中的位置。
- 加入所有媒體後,應用程式會呼叫
invalidate()
,告知預先載入管理工具為每個項目設定優先順序,然後預先載入這些項目。 - 預先載入管理工具會針對每個媒體項目呼叫目標預先載入控制項,查詢應載入的項目量。目標預先載入控制項可能會要求載入特定時長的內容、只擷取項目的中繼資料,或暫時不擷取該項目。預先載入管理工具取得這項資訊後,就會開始載入媒體內容。
- 使用者開始播放內容時,應用程式會呼叫預先載入管理工具,要求該媒體項目的
MediaSource
。應用程式也會呼叫setCurrentPlayingIndex()
,告知預先載入管理工具目前播放的媒體項目。 - 如果使用者改為播放其他媒體項目,應用程式會向預先載入管理工具要求該項目,並更新目前播放的索引。然後再次呼叫
invalidate()
,告知預先載入管理工具根據目前播放的內容更新優先順序。 - 如果應用程式在輪播中新增或移除媒體項目,也會在預先載入管理工具中新增或移除這些項目,並在完成後呼叫
invalidate()
。 - 每當預先載入管理工具的優先順序失效時,系統會再次呼叫目標預先載入控制項,瞭解要載入多少項目。
- 應用程式關閉輪播時,會釋出預先載入管理工具,以釋出資源。