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