หน้านี้จะอธิบายวิธีใช้เครื่องมือจัดการการโหลดล่วงหน้าเพื่อจัดการเนื้อหาวิดีโอ การใช้เครื่องมือจัดการการโหลดล่วงหน้าจะช่วยให้ผู้ใช้ได้รับประสบการณ์ที่ดีขึ้น เมื่อผู้ใช้เปลี่ยนจากรายการสื่อหนึ่งไปยังอีกรายการหนึ่ง การเล่นจะเริ่มเร็วขึ้นเนื่องจากเครื่องมือจัดการได้โหลดเนื้อหาบางส่วนไว้แล้ว
หน้านี้ครอบคลุมหัวข้อต่อไปนี้
- เพิ่มรายการสื่อลงในเครื่องมือจัดการการโหลดล่วงหน้า
- ลบล้างลำดับความสำคัญในเครื่องมือจัดการการโหลดล่วงหน้า
- ดึงข้อมูลและเล่นสื่อ
- นำรายการออกจากตัวจัดการการโหลดล่วงหน้า
- ปล่อยตัวจัดการการโหลดล่วงหน้าเมื่อใช้งานเสร็จแล้ว
เพิ่มรายการสื่อลงในเครื่องมือจัดการการโหลดล่วงหน้า
คุณต้องแจ้งให้เครื่องมือจัดการการโหลดล่วงหน้าทราบเกี่ยวกับรายการสื่อแต่ละรายการที่จะติดตาม เช่น หากแอปมีภาพสไลด์ของวิดีโอ คุณจะต้องเพิ่มวิดีโอเหล่านั้นลงใน เครื่องมือจัดการการโหลดล่วงหน้า คุณอาจเพิ่มวิดีโอทั้งหมดหรือ เฉพาะวิดีโอทั้งหมดที่อยู่ใกล้วิดีโอที่กำลังเล่นอยู่ก็ได้ ทั้งนี้ขึ้นอยู่กับกรณีการใช้งาน นอกจากนี้ คุณยังเพิ่ม รายการใหม่ลงในเครื่องมือจัดการการโหลดล่วงหน้าได้ในภายหลัง
การเพิ่มรายการสื่อไม่ได้ทำให้ตัวจัดการการโหลดล่วงหน้าเริ่มโหลดเนื้อหาโดยอัตโนมัติ หากต้องการทริกเกอร์การโหลดล่วงหน้า คุณจะต้องลบล้างลำดับความสำคัญในเครื่องมือจัดการการโหลดล่วงหน้า
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
ประเด็นสำคัญเกี่ยวกับโค้ด
- ข้อมูลโค้ดนี้แสดงวิธีป้อนข้อมูลเริ่มต้นในเครื่องมือจัดการการโหลดล่วงหน้าหลังจากที่คุณสร้างแล้ว
นอกจากนี้ คุณยังเรียกใช้
add()
เพื่อเพิ่มรายการไปยังตัวจัดการการโหลดล่วงหน้าที่มีอยู่ ซึ่งมีข้อมูลอยู่แล้วได้ด้วย - ในข้อมูลโค้ดนี้
pullMediaItemsFromService()
คือตรรกะของแอปในการดึงข้อมูล รายการเนื้อหาที่จะเล่น โค้ดจะเรียกใช้เมธอดนั้นเพื่อดึงรายการ สินค้าสูงสุด 20 รายการ preloadManager
คือDefaultPreloadManager
ที่สร้างในสร้างDefaultPreloadManager
โค้ดจะเรียกใช้เมธอดadd()
ของเครื่องมือจัดการนั้น เพื่อเพิ่มแต่ละรายการในภาพสไลด์rankingData
คือค่าที่ตัวจัดการการโหลดล่วงหน้าใช้เพื่อกำหนดลำดับความสำคัญ ของรายการสื่อแต่ละรายการ สำหรับDefaultPreloadManager
rankingData
คือจำนวนเต็ม ที่แสดงตำแหน่งของรายการในภาพสไลด์ เครื่องมือจัดการการโหลดล่วงหน้า จะกำหนดลำดับความสำคัญตามระยะห่างของแต่ละรายการจากรายการที่ กำลังเล่นอยู่
ยกเลิกลำดับความสำคัญในเครื่องมือจัดการการโหลดล่วงหน้า
หากต้องการทริกเกอร์เครื่องมือจัดการการโหลดล่วงหน้าให้เริ่มโหลดเนื้อหาล่วงหน้า คุณต้องเรียกใช้
invalidate()
เพื่อบอกเครื่องมือจัดการการโหลดล่วงหน้าว่าลำดับความสำคัญของรายการนั้นล้าสมัยแล้ว
คุณควรดำเนินการในสถานการณ์ต่อไปนี้
- เมื่อคุณเพิ่มรายการสื่อใหม่ลงในเครื่องมือจัดการการโหลดล่วงหน้า หรือนำรายการสื่อออก
หากคุณเพิ่มหรือนำสินค้าหลายรายการออก คุณควรเพิ่มสินค้าทั้งหมด
จากนั้นเรียกใช้
invalidate()
- เมื่อผู้ใช้เปลี่ยนจากรายการสื่อหนึ่งไปยังอีกรายการหนึ่ง ในกรณีนี้ คุณควรตรวจสอบว่าได้อัปเดตดัชนีการเล่นปัจจุบันก่อนเรียกใช้
invalidate()
ตามที่อธิบายไว้ในดึงข้อมูลและเล่นเนื้อหา
เมื่อคุณลบล้างตัวจัดการการโหลดล่วงหน้า ระบบจะเรียกใช้
TargetPreloadStatusControl
ที่คุณสร้างเพื่อดูว่าควรโหลดเนื้อหา
จากแต่ละรายการมากน้อยเพียงใด จากนั้นจะโหลดเนื้อหาสำหรับแต่ละรายการตามลำดับความสำคัญจากสูงไปต่ำ
preloadManager.invalidate()
ประเด็นสำคัญเกี่ยวกับโค้ด
- การเรียกใช้
invalidate()
จะทําให้ตัวจัดการการโหลดล่วงหน้าประเมินลำดับความสำคัญของรายการสื่อแต่ละรายการที่รู้จักอีกครั้ง ด้วยเหตุนี้ หากคุณทำการเปลี่ยนแปลงในเครื่องมือจัดการการโหลดล่วงหน้าหลายรายการ คุณควรทำการเปลี่ยนแปลงให้เสร็จสิ้นก่อนที่จะเรียกใช้invalidate()
ดึงและเล่นสื่อ
เมื่อผู้ใช้ไปยังรายการสื่อใหม่ คุณจะต้องรับรายการสื่อจาก เครื่องมือจัดการการโหลดล่วงหน้า หากตัวจัดการการโหลดล่วงหน้าโหลดเนื้อหาใดๆ ไว้ เนื้อหาจะเล่นได้เร็วกว่าในกรณีที่คุณไม่ได้ใช้ตัวจัดการการโหลดล่วงหน้า หากตัวจัดการการโหลดล่วงหน้ายังไม่ได้โหลดเนื้อหาจากรายการดังกล่าว เนื้อหาจะ เล่นตามปกติ
// 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()
ประเด็นสำคัญเกี่ยวกับโค้ด
player
คือ Media3ExoPlayer
ที่แอปใช้เล่นเนื้อหา คุณต้องสร้างเพลเยอร์ดังกล่าวโดยเรียกใช้DefaultPreloadManager.Builder.buildExoPlayer()
ในบิลเดอร์เดียวกันกับที่ใช้สร้างเครื่องมือจัดการการโหลดล่วงหน้า- เมื่อผู้ใช้เปลี่ยนไปใช้รายการสื่อใหม่ แอปจะเรียกใช้
getMediaSource()
เพื่อรับแหล่งที่มาของสื่อจากตัวจัดการการโหลดล่วงหน้า ซึ่งต้องเป็นmediaItem
ที่คุณเพิ่มลงในเครื่องมือจัดการการโหลดล่วงหน้าแล้ว ไม่เป็นไรหาก เครื่องมือจัดการการโหลดล่วงหน้ายังไม่ได้เริ่มโหลดเนื้อหา ในกรณีนี้ เครื่องมือจะ แสดงผลMediaSource
ที่ไม่มีข้อมูลที่โหลดล่วงหน้า เช่น กรณีที่ผู้ใช้เลื่อนภาพในคําหมุนไปข้างหน้าอย่างรวดเร็ว - หลังจากที่ผู้ใช้เล่นรายการสื่อใหม่แล้ว ให้เรียกใช้
setCurrentPlayingIndex
เพื่อ บอกตัวจัดการการโหลดล่วงหน้าว่ารายการใหม่นี้อยู่ในส่วนใดของภาพสไลด์ ตัวจัดการการโหลดล่วงหน้า ต้องใช้ข้อมูลดังกล่าวเพื่อจัดลําดับความสําคัญในการโหลดรายการถัดไป หลังจากอัปเดตดัชนีปัจจุบันแล้ว ให้เรียกใช้invalidate()
เพื่อให้ตัวจัดการการโหลดล่วงหน้ากำหนดลำดับความสำคัญของแต่ละรายการใหม่
นำรายการออกจากเครื่องมือจัดการการโหลดล่วงหน้า
คุณควรนำรายการที่ตัวจัดการการโหลดล่วงหน้าไม่จำเป็นต้องติดตามออกเพื่อให้ตัวจัดการการโหลดล่วงหน้าทำงานได้อย่างมีประสิทธิภาพ นอกจากนี้ คุณยังอาจนำรายการที่ยังอยู่ใน ภาพสไลด์ออกได้ด้วย หากอยู่ไกลจากตำแหน่งปัจจุบันของผู้ใช้ ตัวอย่างเช่น คุณอาจตัดสินใจว่าหากรายการอยู่ห่างจากสิ่งที่ผู้ใช้ กำลังดูมากกว่า 15 รายการ ก็ไม่จำเป็นต้องโหลดล่วงหน้า ในกรณีนี้ คุณจะนำรายการออก เมื่อรายการอยู่ไกลออกไป หากผู้ใช้กลับไปใกล้กับรายการที่นำออก คุณจะเพิ่มรายการเหล่านั้นกลับได้ทุกเมื่อ
preloadManager.remove(mediaItem)
ประเด็นสำคัญเกี่ยวกับโค้ด
- หากต้องการนำรายการทั้งหมดออกจากเครื่องมือจัดการการโหลดล่วงหน้า คุณสามารถเรียกใช้
reset()
แทนremove()
ได้ วิธีนี้มีประโยชน์หากคุณต้องการเปลี่ยนรายการทั้งหมดในภาพหมุน ในกรณีนี้ หลังจากนำรายการออกแล้ว คุณจะต้องเพิ่มรายการใหม่ลงในเครื่องมือจัดการการโหลดล่วงหน้า จากนั้นลบล้างลำดับความสำคัญในเครื่องมือจัดการการโหลดล่วงหน้า
ปล่อยตัวจัดการการโหลดล่วงหน้าเมื่อใช้งานเสร็จแล้ว
เมื่อไม่ต้องการใช้เครื่องมือจัดการการโหลดล่วงหน้าอีกต่อไป คุณต้องปล่อยเครื่องมือดังกล่าวเพื่อเพิ่มพื้นที่ว่างสำหรับ ทรัพยากร โดยเฉพาะอย่างยิ่ง อย่าลืมปล่อยเมื่อกิจกรรมถูกทำลาย
preloadManager.release()
ประเด็นสำคัญเกี่ยวกับโค้ด
- คุณต้องไม่เรียกใช้เมธอดของออบเจ็กต์หลังจากที่เผยแพร่ออบเจ็กต์แล้ว
- หากต้องการสร้างเครื่องมือจัดการการโหลดล่วงหน้าอีก ให้สร้าง
DefaultPreloadManager.Builder
ใหม่ แล้วใช้เครื่องมือดังกล่าวเพื่อสร้างDefaultPreloadManager
อย่าพยายามใช้เครื่องมือสร้างเวอร์ชันเก่าซ้ำ