كيفية التعامل مع استثناء وقت التشغيل على تشغيل الملفات الصوتية؟
-
20-09-2019 - |
سؤال
لدي زر يقوم بتشغيل ملف صوتي على مستمع النقر. إذا تم النقر فوق الزر مرارا وتكرارا أثناء تشغيل ملف الصوت ثم تعطل التطبيق. ما هو الحل؟
هنا هو بعض الكود للإشارة:
private OnClickListener btnMercyListener = new OnClickListener()
{
public void onClick(View v)
{
// Toast.makeText(getBaseContext(),
// "Mercy audio file is being played",
// Toast.LENGTH_LONG).show();
if (status==true)
{
mp.stop();
mp.release();
status = false;
}
else
{
mp = MediaPlayer.create(iMEvil.this,R.raw.mercy);
//mp.start();
try{
mp.start();
status= true;
//mp.release();
}catch(NullPointerException e)
{
Log.v("MP error",e.toString());
}
}
mp.setOnCompletionListener(new OnCompletionListener(){
// @Override
public void onCompletion(MediaPlayer arg0) {
mp.release();
status = false;
}
}
);
}
};
المحلول
شيئان:
1. قم بتصحيح الحادث ومعرفة أين فشل (الخط).
2. تحيط بالبيان بأكمله مع TRY / CATCK وببساطة التقاط استثناء.
إذا كان لديك استثناء أو فكرة أفضل حيث يفشل الكود الخاص بك، فسيكون من الأسهل بكثير تقديم المشورة لك حول كيفية إصلاحه ... في الواقع، قد لا تحتاج حتى إلى نصيحة لإصلاحها، أنت قد ينتهي بحل المشكلة بنفسك، ثم ستجني ثمار نجاحك.
تحديث لكل تعليقات:
الوثائق ل مشغل الوسائط يشير إلى ما قد يكون المشكلة بالنظر إلى الأعراض التي يرى المرجع:
لإيقاف التشغيل، اتصل
stop()
. وبعد إذا كنت ترغب في إعادة تشغيل الوسائط لاحقا، فيجب عليكreset()
وprepare()
الMediaPlayer
كائن قبل الاتصالstart()
تكرارا. فيcreate()
المكالماتprepare()
المرة الأولى.)
يبدو أنه إذا ضغط زر التشغيل عدة مرات، فقد ينتهي وسائط الإعلام غير موجود في الحالة المعدة وبالتالي رمي بعض الاستثناء. فكرة تعطيل زر التشغيل صالحة وينبغي أن تهتم بهذا الموقف.
إليك بعض التعليمات البرمجية التوضيحية حول ما تريد القيام به برنامجك:
private OnClickListener btnMercyListener = new OnClickListener()
{
public void onClick(View v)
{
if(isPressed)
{
return;
}
isPressed = true;
// create your media player
mp = MediaPlayer.create(iMEvil.this,R.raw.mercy);
// set your listener
mp.setOnCompletionListener(mp.setOnCompletionListener(new OnCompletionListener(){
// @Override
public void onCompletion(MediaPlayer arg0) {
if(!isPressed)
{
return;
}
isPressed = false;
// re-enable your play button
playButton.enable();
// disable the pause button
pauseButton.disable();
mp.release();
mp.prepare();
}
}
);
// disable the play button
playButton.disable();
// enable the pause button
pauseButton.enable();
// start playback
mp.start();
}
};
بالطبع يجب أن يكون لديك بيانات المحاولة / التقاطات المناسبة هناك حتى لا يتعطل تطبيقك، ولكن يجب أن يمنحك هذا الرمز فكرة عامة عن ما يجب القيام به.