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