إدارة حالة MediaPlayer وموارده

يتناول هذا المستند مجالَين يتضمّنان عيوبًا محتملة.

  • الحالة: باستخدام Medialayer، لا تكون بعض العمليات صالحة إلا في حالات معيّنة. يمكن أن تؤدي العمليات غير الصحيحة إلى حدوث استثناءات أو سلوك غير متوقّع.

  • الموارد عند إجراء تغييرات على الإعدادات، مثل تدوير الشاشة، يجب تحرير عنصر 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() للتأكّد من تحرير أي موارد نظام تم تخصيصها له بشكل صحيح.

على سبيل المثال، إذا كنت تستخدم MediaPlayer وتلقّى نشاطك طلبًا للانتقال إلى onStop()، عليك إزالة MediaPlayer، لأنّه لا داعي للاحتفاظ بها عندما لا يتفاعل نشاطك مع المستخدم (ما لم تكن تشغّل وسائط في الخلفية، وهو ما تتم مناقشته في القسم التالي).

عند استئناف نشاطك أو إعادة تشغيله، عليك إنشاء ملف MediaPlayer جديد وإعداده مرة أخرى قبل استئناف التشغيل.

في ما يلي كيفية إصدار MediaPlayer ثم إلغاء إصدارها:

Kotlin

mediaPlayer?.release()
mediaPlayer = null

Java

mediaPlayer.release();
mediaPlayer = null;

على سبيل المثال، ننصحك بالتفكير في المشاكل التي قد تحدث إذا نسيت إزالة القيمة من العنصر MediaPlayer عند إيقاف نشاطك، ولكن أنشأت قيمة جديدة عند بدء النشاط مرة أخرى. عندما يغيّر المستخدم اتجاه الشاشة (أو يغيّر إعدادات الجهاز بطريقة أخرى)، يعيد النظام تشغيل النشاط تلقائيًا. قد تستهلك بسرعة جميع موارد النظام عندما يدوير المستخدم الجهاز ذهاباً وإيابًا بين الوضعَين العمودي والأفقي، لأنّه عند كل تغيير في الاتجاه، يتم إنشاء MediaPlayer جديد لا يتم إطلاقه مطلقًا.

لمزيد من المعلومات عن عمليات إعادة تشغيل وقت التشغيل، يُرجى الاطّلاع على معالجة تغييرات وقت التشغيل.

قد تتساءل ماذا يحدث إذا أردت مواصلة تشغيل "مواد الوسائط في الخلفية" حتى عندما يغادر المستخدم نشاطك، تمامًا مثل السلوك الذي يتبعه تطبيق Music المضمّن. في هذه الحالة، ما تحتاج إليه هو MediaPlayer تتحكم فيه خدمة، كما هو موضّح في القسم التالي.

مزيد من المعلومات

‫Jetpack Media3 هو الحلّ المُقترَح لتشغيل الوسائط في تطبيقك. اطّلِع على مزيد من المعلومات حوله.

تتناول هذه الصفحات مواضيع تتعلّق بتسجيل المحتوى الصوتي والفيديو وتخزينه وتشغيله: