0

私は文字通りどこでも検索できますが、この問題の解決策を見つけることはできませんでした。AndroidStudioで保留中のIntentでAlarmManagerを呼び出すときに遅延が発生するのはなぜですか?

私はカウントダウンタイマーアプリケーションを構築しています。しかし、私が直面している問題は、00:00.0までカウントするたびに、警報が鳴るまでに5秒〜5秒待つということです。その間に何かをクリックした場合、アプリがクラッシュすることがありますが、アラームが鳴り、プロセスを繰り返すまで待ってからもう一度5秒間待機しますが、リセット(5秒間または5秒間)を押すと、それはうまく動作しています!ここでエラーがある:

07-13 14:51:08.838 8808-8808/tech.dronerace.productivitytimer D/AndroidRuntime: Shutting down VM 
 
07-13 14:51:08.838 8808-8808/tech.dronerace.productivitytimer E/AndroidRuntime: FATAL EXCEPTION: main 
 
                       Process: tech.dronerace.productivitytimer, PID: 8808 
 
                       java.lang.RuntimeException: Unable to start service [email protected] with Intent { cmp=tech.dronerace.productivitytimer/.Ringtone (has extras) }: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.stop()' on a null object reference 
 
                        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3027) 
 
                        at android.app.ActivityThread.-wrap17(ActivityThread.java) 
 
                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1442) 
 
                        at android.os.Handler.dispatchMessage(Handler.java:102) 
 
                        at android.os.Looper.loop(Looper.java:148) 
 
                        at android.app.ActivityThread.main(ActivityThread.java:5417) 
 
                        at java.lang.reflect.Method.invoke(Native Method) 
 
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
 
                       Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.stop()' on a null object reference 
 
                        at tech.dronerace.productivitytimer.Ringtone.onStartCommand(Ringtone.java:52) 
 
                        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3010) 
 
                        at android.app.ActivityThread.-wrap17(ActivityThread.java)  
 
                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1442)  
 
                        at android.os.Handler.dispatchMessage(Handler.java:102)  
 
                        at android.os.Looper.loop(Looper.java:148)  
 
                        at android.app.ActivityThread.main(ActivityThread.java:5417)  
 
                        at java.lang.reflect.Method.invoke(Native Method)  
 
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  
 
07-13 14:56:09.149 8808-8808/tech.dronerace.productivitytimer I/Process: Sending signal. PID: 8808 SIG: 9

、ここでは私のメソッドのコードは次のとおりです。

public void countDone() { 
    ((Button) findViewById(R.id.b_start)).setVisibility(View.GONE); 
    ((Button) findViewById(R.id.b_reset)).setVisibility(View.VISIBLE); 
    ((Button) findViewById(R.id.b_stop)).setVisibility(View.GONE); 
    ((TextView) findViewById(R.id.timer_id)).setText("00:00"); 
    ((TextView) findViewById(R.id.timerMs_id)).setText(".0"); 

    //----------------Alarm && Vibration && Progress----------------\\ 

    final Intent i = new Intent(SecondStep.this, Alarm.class); 
    i.putExtra("extra", "soundOn"); 
    PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 0, i, PendingIntent.FLAG_UPDATE_CURRENT); 
    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     am.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pi); 
    } else { 
     am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pi); 
    } 


    Button b = (Button) findViewById(R.id.b_reset); 
    b.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 

      updateTimer(startTimeInitialG); 
      i.putExtra("extra", "soundOff"); 
      PendingIntent.getBroadcast(getApplicationContext(), 0, i, PendingIntent.FLAG_UPDATE_CURRENT); 
      sendBroadcast(i); 

      clickReset(v); 

      ((Button) findViewById(R.id.b_start)).setVisibility(View.VISIBLE); 
      ((Button) findViewById(R.id.b_reset)).setVisibility(View.GONE); 
     } 
    }); 
} 

今、私は天候に音楽を決定するためにエクストラを置くことができるこの方法として意図保留を選択しましたリセットボタンを押してシャットダウンしたか、まだ再生中です。故意にそれが保留中の意図であることを私は即座に警告するだけでなく、正確に(上のコードを参照してください)と更新するフラグを設定します。しかし、何も助けてくれないようです。私はまた、私のカスタムビルドタイマーからTimerに使用されているAlarmManagerの継承フォルトがあるかもしれないと思ってCountDownTimerクラスに切り替えましたが、同じ問題が再現されました。

なぜ私のアラームが遅れて呼び出されていますか?私は間違って何をしていますか? :P

PSここは私の着メロクラスです(エラーのため)。

public class Ringtone extends Service { 

MediaPlayer alarmPlayer; 
boolean isRunning; 

@Nullable 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 


@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    //get info on weather the reset was pressed and convert it to int so you can see weather you play or stop the music 
    String state = intent.getExtras().getString("extra"); 
    assert state != null; //prevents app from crashing 
    switch (state) { 
     case "soundOn": 
      startId = 1; 
      break; 
     case "soundOff": 
      startId = 0; 
      break; 
     default: 
      startId = 0; 
      break; 
    } 



    Log.e("Is the state = 1 or 0?", state); 
    System.out.println(startId); 

    //we pressed reset or ('soundOff' ->extra) then cut it off 
    if(startId == 0) { 

     alarmPlayer.stop(); 
     alarmPlayer.reset(); 
     isRunning = false; 
    } 
    //we pressed nothing and is automatically ('soundOn' ->extra) so let it play 
    else if(startId == 1) { 

     alarmPlayer = MediaPlayer.create(this, R.raw.imperialmarch); 
     alarmPlayer.start(); 
     isRunning = true; 
    } 




    return START_NOT_STICKY; 
} 

@Override 
public void onDestroy() { 
    Log.e("On Destroy called..", "yes"); 
    super.onDestroy(); 
} 

}

+0

なぜAlarmManagerの代わりにCountDownTimerを使用しないのですか? –

+0

同じ問題を試してみました。:PIは私の質問にすべてを書きました 問題は意図がまだ作成されていないと思います。リセットするためにクリックすると、まだ作成されていないものを停止しようとしています...ダニー – theDuke

答えて

0

なぜあなたはPendingIntentを作成し、あなたのBroadcastRecieverをトリガするために、すぐに消灯し、アラームを設定していますか?これはすぐにトリガされます

final Intent i = new Intent(SecondStep.this, Alarm.class); 
i.putExtra("extra", "soundOn"); 
sendBroadcast(i); 

、あなたはPendingIntent、またアラームマネージャの関与を必要としません:あなたはこのように、Intent自分でブロードキャストを送信することができます。

関連する問題