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

يغطّي هذا المستند مجالَين يمكن أن يؤدّيا إلى مشاكل محتملة.

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

  • الموارد : عند إجراء تغييرات في الإعدادات، مثل تدوير الشاشة، يجب إيقاف كائن MediaPlayer لتحرير موارد النظام وتجنُّب استنفادها.

إدارة الحالة

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

يوضّح مخطط الحالة في مستندات فئة MediaPlayer الطرق التي تنقل MediaPlayer من حالة إلى أخرى. على سبيل المثال:

  • عند إنشاء MediaPlayer جديد، يكون في الحالة Idle.
  • يمكنك تهيئته من خلال استدعاءsetDataSource()، ما يؤدي إلى تغييره إلى الحالة Initialized.
  • يمكنك إعداده باستخدام الطريقتَين prepare() أو prepareAsync().
  • عندما ينتهي MediaPlayer من الإعداد، ينتقل إلى الحالة Prepared ، ما يعني أنّه يمكنك استدعاء start() لتشغيل الوسائط.

في هذه المرحلة، وكما يوضّح المخطط، يمكنك الانتقال بين الحالات Started, PausedPlaybackCompleted من خلال استدعاء طرق مثل 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 جديدًا لا توقفه أبدًا.

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

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

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

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

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