จัดการและเล่นเนื้อหา

หน้านี้จะอธิบายวิธีใช้เครื่องมือจัดการการโหลดล่วงหน้าเพื่อจัดการเนื้อหาวิดีโอ การใช้เครื่องมือจัดการการโหลดล่วงหน้าจะช่วยให้ผู้ใช้ได้รับประสบการณ์ที่ดีขึ้น เมื่อผู้ใช้เปลี่ยนจากรายการสื่อหนึ่งไปยังอีกรายการหนึ่ง การเล่นจะเริ่มเร็วขึ้นเนื่องจากเครื่องมือจัดการได้โหลดเนื้อหาบางส่วนไว้แล้ว

หน้านี้ครอบคลุมหัวข้อต่อไปนี้

เพิ่มรายการสื่อลงในเครื่องมือจัดการการโหลดล่วงหน้า

คุณต้องแจ้งให้เครื่องมือจัดการการโหลดล่วงหน้าทราบเกี่ยวกับรายการสื่อแต่ละรายการที่จะติดตาม เช่น หากแอปมีภาพสไลด์ของวิดีโอ คุณจะต้องเพิ่มวิดีโอเหล่านั้นลงใน เครื่องมือจัดการการโหลดล่วงหน้า คุณอาจเพิ่มวิดีโอทั้งหมดหรือ เฉพาะวิดีโอทั้งหมดที่อยู่ใกล้วิดีโอที่กำลังเล่นอยู่ก็ได้ ทั้งนี้ขึ้นอยู่กับกรณีการใช้งาน นอกจากนี้ คุณยังเพิ่ม รายการใหม่ลงในเครื่องมือจัดการการโหลดล่วงหน้าได้ในภายหลัง

การเพิ่มรายการสื่อไม่ได้ทำให้ตัวจัดการการโหลดล่วงหน้าเริ่มโหลดเนื้อหาโดยอัตโนมัติ หากต้องการทริกเกอร์การโหลดล่วงหน้า คุณจะต้องลบล้างลำดับความสำคัญในเครื่องมือจัดการการโหลดล่วงหน้า

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

นำรายการออกจากเครื่องมือจัดการการโหลดล่วงหน้า

คุณควรนำรายการที่ตัวจัดการการโหลดล่วงหน้าไม่จำเป็นต้องติดตามออกเพื่อให้ตัวจัดการการโหลดล่วงหน้าทำงานได้อย่างมีประสิทธิภาพ นอกจากนี้ คุณยังอาจนำรายการที่ยังอยู่ใน ภาพสไลด์ออกได้ด้วย หากอยู่ไกลจากตำแหน่งปัจจุบันของผู้ใช้ ตัวอย่างเช่น คุณอาจตัดสินใจว่าหากรายการอยู่ห่างจากสิ่งที่ผู้ใช้ กำลังดูมากกว่า 15 รายการ ก็ไม่จำเป็นต้องโหลดล่วงหน้า ในกรณีนี้ คุณจะนำรายการออก เมื่อรายการอยู่ไกลออกไป หากผู้ใช้กลับไปใกล้กับรายการที่นำออก คุณจะเพิ่มรายการเหล่านั้นกลับได้ทุกเมื่อ

preloadManager.remove(mediaItem)

ประเด็นสำคัญเกี่ยวกับโค้ด

ปล่อยตัวจัดการการโหลดล่วงหน้าเมื่อใช้งานเสร็จแล้ว

เมื่อไม่ต้องการใช้เครื่องมือจัดการการโหลดล่วงหน้าอีกต่อไป คุณต้องปล่อยเครื่องมือดังกล่าวเพื่อเพิ่มพื้นที่ว่างสำหรับ ทรัพยากร โดยเฉพาะอย่างยิ่ง อย่าลืมปล่อยเมื่อกิจกรรมถูกทำลาย

preloadManager.release()

ประเด็นสำคัญเกี่ยวกับโค้ด

  • คุณต้องไม่เรียกใช้เมธอดของออบเจ็กต์หลังจากที่เผยแพร่ออบเจ็กต์แล้ว
  • หากต้องการสร้างเครื่องมือจัดการการโหลดล่วงหน้าอีก ให้สร้าง DefaultPreloadManager.Builderใหม่ แล้วใช้เครื่องมือดังกล่าวเพื่อสร้าง DefaultPreloadManager อย่าพยายามใช้เครื่องมือสร้างเวอร์ชันเก่าซ้ำ