私は文字通りどこでも検索できますが、この問題の解決策を見つけることはできませんでした。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();
}
}
なぜAlarmManagerの代わりにCountDownTimerを使用しないのですか? –
同じ問題を試してみました。:PIは私の質問にすべてを書きました 問題は意図がまだ作成されていないと思います。リセットするためにクリックすると、まだ作成されていないものを停止しようとしています...ダニー – theDuke