2015-09-15 4 views
1

Я пытаюсь отложить будильник, нажатие кнопки повтора перезапускает одно и то же действие после предопределенного времени. Однако, когда я нажимаю кнопку повтора, приложение падает, и в logcat мне предоставляется ошибка: java.lang.IllegalStateException. Вот код, который я использую для отсрочки, Помогите мне найти, где я делаю неправильно, и лучшая альтернатива для его исправления. Спасибо,Перезапуск операции заканчивается на IllegalStateException

public void snoozeup(View view) 
{ 
    SharedPreferences sa = getSharedPreferences("SnoozeList", Context.MODE_PRIVATE); 
    int snox = sa.getInt("SnoozeX",0); 

    if(snox==2) { 

     Handler handler = new Handler(); 
     Runnable x = new Runnable() { 
      @Override 
      public void run() 
      { 
       startActivity(new Intent(Time_Date.this, Time_Date.class)); 
      } 
     }; 
     handler.postDelayed(x, 120000); 

    } 

    else if(snox==3) { 

     Handler handler = new Handler(); 
     Runnable x = new Runnable() { 
      @Override 
      public void run() { 
       startActivity(new Intent(Time_Date.this, Time_Date.class)); 
      } 
     }; 
     handler.postDelayed(x, 180000); 

    } 
    else if(snox==5) { 

     Handler handler = new Handler(); 
     Runnable x = new Runnable() { 
      @Override 
      public void run() { 
       startActivity(new Intent(Time_Date.this, Time_Date.class)); 
      } 
     }; 
     handler.postDelayed(x, 300000); 

    } 
    else if(snox==10) { 

     Handler handler = new Handler(); 
     Runnable x = new Runnable() { 
      @Override 
      public void run() { 
       startActivity(new Intent(Time_Date.this, Time_Date.class)); 
      } 
     }; 
     handler.postDelayed(x, 600000); 

    } 
    else 
    { 
     Handler handler = new Handler(); 
     Runnable x = new Runnable() { 
      @Override 
      public void run() { 
       startActivity(new Intent(Time_Date.this, Time_Date.class)); 
      } 
     }; 
     handler.postDelayed(x, 180000); 

    } 

    mp.stop(); 
    mp.release(); 
    voicePlayer.stop(); 
    voicePlayer.release(); 
    songPlayer.stop(); 
    songPlayer.release(); 



    finish(); 
} 

Вот полный трассировки стека:

> java.lang.IllegalStateException 
      at android.media.MediaPlayer.isPlaying(Native Method) 
      at zyia.alarm.zyia.zyia.Time_Date$4.run(Time_Date.java:199) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5254) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
09-15 11:49:25.805 1793-1793/zyia.alarm.zyia.zyia I/Process﹕ Sending signal. PID: 1793 SIG: 9 

Кроме того, я использую isPlaying() метод в этой деятельности, а вот как это:

try { 
     final Handler hlr = new Handler(); 

     final Runnable looper = new Runnable() { 
      @Override 
      public void run() { 

       if (mp != null) { 

        if (mp.isPlaying()) { 
         mp.stop(); 
        } 

       } 


       mp.start(); 

      } 
     }; 


     mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      public void onCompletion(MediaPlayer mp) { 
       hlr.postDelayed(looper, 5000); 
      } 
     }); 

    } 
    catch(IllegalStateException e) 
    { 
     e.printStackTrace(); 

    } 
+0

Опубликовать полную стопку пожалуйста. –

+0

опубликовать ваш logcat – Rustam

+0

Я отправил полную трассировку стека – OBX

ответ

1

Применить состояние isPlaying() для этих линий тоже

mp.stop(); 
mp.release(); 
voicePlayer.stop(); 
voicePlayer.release(); 
songPlayer.stop(); 
songPlayer.release(); 

как этот

if(mp.isPlaying()) { 
    mp.stop(); 
} 
1

предположим, если ваш mp в уже stop состоянии, и вы пытаетесь stop снова, так что вы получите java.lang.IllegalStateException.

также проверить, если ваши ресурсы не null как mp,voicePlayer,songPlayer

вы должны проверить isPlaying() до того stop()

не проверить, как:

 try { 
      if (mp != null && mp.isPlaying()) { 
       Log.d("TAG------->", "mp is running"); 
       mp.stop(); 
       Log.d("TAG------->", "mp is stopped"); 
       mp.release(); 
       Log.d("TAG------->", "mp is released"); 

      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
+0

Должен ли я проверить его для всех экземпляров MediaPlayer или просто 'mp'? – OBX

+0

все экземпляры, для которых вы пытаетесь изменить свое состояние. – Rustam

0

Вы звоните stop() метод без проверки. Играется или нет. Если он не воспроизводится, и вы вызываете метод stop(), чем незаконныйStateException, так что действительно проверьте, не установлен ли mediaPlayer instanse isPlaying() или нет.

if(mp.isPlaying()){ 
    mp.stop(); 
} 
Смежные вопросы