หน้านี้อธิบายวิธีสร้าง DefaultPreloadManager ซึ่งจะโหลด
เนื้อหาสื่อล่วงหน้าสำหรับแอปของคุณตามกลยุทธ์ที่คุณเลือก
เครื่องมือจัดการการโหลดล่วงหน้าซึ่งอิงตามคลาส Abstract BasePreloadManager ช่วยให้คุณ
จัดอันดับเนื้อหาตามเกณฑ์ที่เลือกได้ เอกสารนี้อธิบายวิธีใช้คลาสที่ได้มา DefaultPreloadManager ซึ่งจะจัดอันดับรายการสื่อแต่ละรายการด้วยจำนวนเต็มที่แสดงตำแหน่งของรายการในรายการ (เช่น ตำแหน่งในภาพสไลด์วิดีโอ) เครื่องมือจัดการการโหลดล่วงหน้าจะจัดลำดับความสำคัญในการโหลดรายการตามระยะห่างจากรายการที่ผู้ใช้กำลังเล่นอยู่ วิธีนี้จะช่วยให้รายการใหม่เริ่มเล่นได้ทันทีหากผู้ใช้ย้ายไปที่รายการอื่น
การสร้างอินสแตนซ์ของ DefaultPreloadManager มี 3 ขั้นตอนดังนี้
- กำหนด
TargetPreloadStatusControlซึ่งเครื่องมือจัดการการโหลดล่วงหน้าจะใช้เพื่อ ค้นหาว่ารายการสื่อพร้อมที่จะโหลดหรือไม่ และควรโหลดมากน้อยเพียงใด - สร้างเครื่องมือสร้างที่คุณจะใช้เพื่อสร้างเครื่องมือจัดการการโหลดล่วงหน้าและ
เพื่อสร้างออบเจ็กต์
ExoPlayerของแอป - ใช้เครื่องมือสร้างเพื่อสร้างเครื่องมือจัดการการโหลดล่วงหน้าโดยเรียกใช้เมธอด
build()ของเครื่องมือสร้าง
สร้างตัวควบคุมสถานะการโหลดล่วงหน้าเป้าหมาย
เมื่อสร้าง DefaultPreloadManager.Builder คุณจะต้องส่งออบเจ็กต์
ตัวควบคุมสถานะการโหลดล่วงหน้าเป้าหมายที่คุณกำหนด ออบเจ็กต์นี้ใช้อินเทอร์เฟซ TargetPreloadStatusControl เมื่อเครื่องมือจัดการการโหลดล่วงหน้าพร้อมที่จะโหลดสื่อล่วงหน้า ระบบจะเรียกใช้เมธอด
getTargetPreloadStatus() ของตัวควบคุมสถานะเพื่อดูว่าควรโหลดเนื้อหามากน้อยเพียงใด ตัวควบคุมสถานะสามารถตอบกลับด้วยรหัสสถานะใดรหัสหนึ่งต่อไปนี้
STAGE_SPECIFIED_RANGE_LOADED: เครื่องมือจัดการการโหลดล่วงหน้าควรโหลดเนื้อหาจากตำแหน่งเริ่มต้นที่ระบุและตามระยะเวลาที่ระบุ (ระบุเป็นมิลลิวินาที)STAGE_TRACKS_SELECTED: เครื่องมือจัดการการโหลดล่วงหน้าควรโหลดและประมวลผลข้อมูลแทร็กเนื้อหา แล้วเลือกแทร็ก เครื่องมือจัดการการโหลดล่วงหน้ายังไม่ควรเริ่มโหลดเนื้อหาSTAGE_SOURCE_PREPARED: เครื่องมือจัดการการโหลดล่วงหน้าควรเตรียมแหล่งที่มาของเนื้อหา เช่น หากข้อมูลเมตาของเนื้อหาอยู่ในไฟล์ Manifest แยกต่างหาก เครื่องมือจัดการการโหลดล่วงหน้าอาจดึงและแยกวิเคราะห์ Manifest นั้นnull: เครื่องมือจัดการการโหลดล่วงหน้าไม่ควรโหลดเนื้อหาหรือข้อมูลเมตาสำหรับรายการสื่อนั้น
คุณจะต้องมีกลยุทธ์ในการตัดสินใจว่าจะโหลดเนื้อหามากน้อยเพียงใดสำหรับรายการสื่อแต่ละรายการ ในตัวอย่างนี้ ระบบจะโหลดเนื้อหาเพิ่มเติมสำหรับรายการที่อยู่ใกล้กับรายการที่กำลังเล่นอยู่ หากผู้ใช้กำลังเล่นเนื้อหาที่มีดัชนี n, ตัวควบคุมจะแสดงรหัสต่อไปนี้
- ดัชนี n+1 (รายการสื่อถัดไป): โหลด 3000 มิลลิวินาที (3 วินาที) จากตำแหน่งเริ่มต้นเริ่มต้น
- ดัชนี n-1 (รายการสื่อก่อนหน้า): โหลด 1000 มิลลิวินาที (1 วินาที) จากตำแหน่งเริ่มต้นเริ่มต้น
- รายการสื่ออื่นๆ ในช่วง n-2 ถึง n+2: แสดงผล
PreloadStatus.TRACKS_SELECTED - รายการสื่ออื่นๆ ในช่วง n-4 ถึง n+4: แสดงผล
PreloadStatus.SOURCE_PREPARED - สำหรับรายการสื่ออื่นๆ ทั้งหมด ให้แสดงผล
null
class MyTargetPreloadStatusControl(var currentPlayingIndex: Int = 0) : TargetPreloadStatusControl<Int, DefaultPreloadManager.PreloadStatus> { override fun getTargetPreloadStatus(index: Int): DefaultPreloadManager.PreloadStatus { if (index - currentPlayingIndex == 1) { // next track // return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED and // suggest loading 3000ms from the default start position return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L) } else if (index - currentPlayingIndex == -1) { // previous track // return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED and // suggest loading 3000ms from the default start position return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L) } else if (abs(index - currentPlayingIndex) == 2) { // return a PreloadStatus that is labelled by STAGE_TRACKS_SELECTED return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_TRACKS_SELECTED } else if (abs(index - currentPlayingIndex) <= 4) { // return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_SOURCE_PREPARED } return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_NOT_PRELOADED } }
ประเด็นสำคัญเกี่ยวกับโค้ด
- คุณจะต้องส่งอินสแตนซ์ของ
MyTargetPreloadStatusControlไปยังเครื่องมือสร้างเครื่องมือจัดการการโหลดล่วงหน้าเมื่อสร้าง currentPlayingIndexจะเก็บดัชนีของรายการสื่อที่กำลังเล่นอยู่ แอปมีหน้าที่ต้องทำให้ค่าดังกล่าวเป็นปัจจุบัน- เมื่อเครื่องมือจัดการการโหลดล่วงหน้าพร้อมที่จะโหลดเนื้อหา ระบบจะเรียกใช้
getTargetPreloadStatusและส่งข้อมูลการจัดอันดับที่คุณระบุสำหรับรายการสื่อที่เกี่ยวข้อง ในกรณีของDefaultPreloadManagerข้อมูลการจัดอันดับดังกล่าวจะเป็นจำนวนเต็มที่ระบุตำแหน่งของรายการในภาพสไลด์ เมธอดจะเลือกรหัสที่จะแสดงผลโดยการเปรียบเทียบดัชนีนั้นกับดัชนีของรายการที่เลือกอยู่ในปัจจุบัน
สร้างเครื่องมือจัดการการโหลดล่วงหน้า
หากต้องการสร้างเครื่องมือจัดการการโหลดล่วงหน้า คุณต้องมี DefaultPreloadManager.Builder
เครื่องมือสร้างดังกล่าวได้รับการกำหนดค่าด้วยบริบทปัจจุบันและตัวควบคุมสถานะการโหลดล่วงหน้าเป้าหมายของแอป นอกจากนี้ เครื่องมือสร้างยังมีเมธอด Setter ซึ่งคุณสามารถใช้เพื่อตั้งค่าคอมโพเนนต์ที่กำหนดเองของเครื่องมือจัดการการโหลดล่วงหน้า
นอกจากการใช้เครื่องมือสร้างเพื่อสร้างเครื่องมือจัดการการโหลดล่วงหน้าแล้ว คุณยังจะใช้เครื่องมือสร้างเพื่อ
สร้าง ExoPlayer ออบเจ็กต์ที่แอปใช้เพื่อเล่นเนื้อหาด้วย
val targetPreloadStatusControl = MyTargetPreloadStatusControl() val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl) val preloadManager = preloadManagerBuilder.build()
ประเด็นสำคัญเกี่ยวกับโค้ด
MyTargetPreloadStatusControlคือคลาสที่คุณกำหนดไว้ใน สร้างตัวควบคุมสถานะการโหลดล่วงหน้าเป้าหมาย- คุณจะใช้
DefaultPreloadManager.Builderเดียวกันเพื่อสร้างออบเจ็กต์ExoPlayerที่จะเล่นเนื้อหาที่เครื่องมือจัดการการโหลดล่วงหน้าดังกล่าวจัดการ