จัดการสถานะและทรัพยากรของ MediaPlayer

เอกสารนี้ครอบคลุม 2 ด้านที่อาจเกิดข้อผิดพลาด

  • รัฐ เมื่อใช้ "Medialayer" การดำเนินการบางอย่างจะใช้ได้เฉพาะในสถานะบางอย่างเท่านั้น การดำเนินการที่ไม่ถูกต้องอาจทำให้เกิดข้อยกเว้นหรือลักษณะการทำงานที่ไม่คาดคิด

  • ทรัพยากร เมื่อทําการเปลี่ยนแปลงการกําหนดค่า เช่น การหมุนหน้าจอ คุณต้องปล่อยออบเจ็กต์ MediaPlayer เพื่อเพิ่มพื้นที่ว่างในทรัพยากรของระบบและหลีกเลี่ยงการหมดทรัพยากร

จัดการสถานะ

MediaPlayer อิงตามสถานะ กล่าวคือ มีสถานะภายในที่คุณต้องคำนึงถึงเสมอเมื่อเขียนโค้ด เนื่องจากการดำเนินการบางอย่างจะถูกต้องก็ต่อเมื่อผู้เล่นอยู่ในสถานะหนึ่งๆ หากคุณดำเนินการขณะอยู่ในสถานะที่ไม่ถูกต้อง ระบบอาจแสดงข้อยกเว้นหรือทําให้ระบบทำงานผิดพลาด

แผนภาพสถานะในเอกสารประกอบของคลาส MediaPlayer จะชี้แจงว่าเมธอดใดที่ย้าย MediaPlayer จากสถานะหนึ่งไปยังอีกสถานะหนึ่ง เช่น

  • เมื่อคุณสร้าง MediaPlayer ใหม่ MediaPlayer ดังกล่าวจะอยู่ในสถานะไม่มีการใช้งาน
  • คุณสามารถเริ่มต้นได้โดยการเรียกใช้ setDataSource() ซึ่งจะเปลี่ยนสถานะเป็นเริ่มต้นแล้ว
  • คุณเตรียมโดยใช้เมธอด prepare() หรือ prepareAsync()
  • เมื่อ MediaPlayer เตรียมพร้อมแล้ว ก็จะเข้าสู่สถานะ Prepared ซึ่งหมายความว่าคุณจะเรียกใช้ start() เพื่อให้เล่นสื่อได้

เมื่อถึงจุดนั้น คุณจะสลับระหว่างสถานะ Started, Paused และ PlaybackCompleted ได้โดยเรียกใช้เมธอดต่างๆ เช่น start(), pause() และ seekTo() เป็นต้น

อย่างไรก็ตาม เมื่อคุณเรียกใช้ stop() คุณจะเรียกใช้ start() ไม่ได้อีกจนกว่าจะเตรียม MediaPlayer อีกครั้ง

อย่าลืมคำนึงถึงแผนภาพสถานะเสมอเมื่อเขียนโค้ดที่โต้ตอบกับออบเจ็กต์ MediaPlayer เนื่องจากการเรียกเมธอดจากสถานะที่ผิดเป็นสาเหตุที่พบบ่อยของข้อบกพร่อง

ปล่อย MediaPlayer

MediaPlayer อาจใช้ทรัพยากรระบบที่มีค่า ดังนั้น คุณจึงควรใช้ความระมัดระวังเพิ่มเติมเสมอเพื่อให้แน่ใจว่าคุณไม่ได้เก็บอินสแตนซ์ MediaPlayer ไว้นานกว่าที่จำเป็น เมื่อดำเนินการเสร็จแล้ว คุณควรเรียกใช้ release() เสมอเพื่อให้แน่ใจว่าระบบได้ปล่อยทรัพยากรทั้งหมดที่กําหนดไว้ให้กับ release() ดังกล่าวแล้ว

ตัวอย่างเช่น หากคุณใช้ MediaPlayer และกิจกรรมได้รับการเรียกใช้ onStop() คุณต้องปล่อย MediaPlayer เนื่องจากไม่มีเหตุผลที่จะเก็บไว้ในขณะที่กิจกรรมไม่ได้โต้ตอบกับผู้ใช้ (เว้นแต่คุณจะเล่นสื่อในเบื้องหลัง ซึ่งจะกล่าวถึงในส่วนถัดไป)

เมื่อกิจกรรมกลับมาดำเนินต่อหรือเริ่มใหม่ คุณจะต้องสร้าง MediaPlayer ใหม่และเตรียมอีกครั้งก่อนเล่นต่อ

วิธีปล่อยและทำให้ MediaPlayer ของคุณเป็นโมฆะมีดังนี้

Kotlin

mediaPlayer?.release()
mediaPlayer = null

Java

mediaPlayer.release();
mediaPlayer = null;

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับการเริ่มรันไทม์ใหม่ได้ที่การจัดการการเปลี่ยนแปลงรันไทม์

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

ดูข้อมูลเพิ่มเติม

Jetpack Media3 เป็นโซลูชันที่แนะนำสำหรับการเล่นสื่อในแอป อ่านข้อมูลเพิ่มเติมเกี่ยวกับโซลูชันนี้

หน้าเหล่านี้ครอบคลุมหัวข้อเกี่ยวกับการบันทึก การจัดเก็บ และการเล่นเสียงและวิดีโอ