كيفية التعامل مع استثناء وقت التشغيل على تشغيل الملفات الصوتية؟

StackOverflow https://stackoverflow.com/questions/2445838

سؤال

لدي زر يقوم بتشغيل ملف صوتي على مستمع النقر. إذا تم النقر فوق الزر مرارا وتكرارا أثناء تشغيل ملف الصوت ثم تعطل التطبيق. ما هو الحل؟

هنا هو بعض الكود للإشارة:

 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();
    }
};

بالطبع يجب أن يكون لديك بيانات المحاولة / التقاطات المناسبة هناك حتى لا يتعطل تطبيقك، ولكن يجب أن يمنحك هذا الرمز فكرة عامة عن ما يجب القيام به.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top