เอกสารนี้ครอบคลุม 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 เป็นโซลูชันที่แนะนำสำหรับการเล่นสื่อในแอปของคุณ อ่านข้อมูลเพิ่มเติม
หน้าเว็บเหล่านี้ครอบคลุมหัวข้อที่เกี่ยวข้องกับการบันทึก การจัดเก็บ และการเล่นเสียงและวิดีโอ