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

เอกสารนี้ครอบคลุม 2 ส่วนที่มีข้อควรระวัง

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

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

จัดการสถานะ

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

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

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

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

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

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

ปล่อย MediaPlayer

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

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

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

วิธีปล่อยและทำให้ MediaPlayer เป็น Null

Kotlin

mediaPlayer?.release()
mediaPlayer = null

Java

mediaPlayer.release();
mediaPlayer = null;

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

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

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

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

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

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