web-dev-qa-db-ja.com

android

タイマーのスケジュールを変更するにはどうすればよいですか。タイマー/タイマータスクをキャンセルし、メソッドを使用して再度スケジュールしようとしました。しかし、それは例外エラーを示しています:

例外エラーjava.lang.IllegalStateException:TimerTaskはすでにスケジュールされています

私が使用したコード:

プライベートタイマータイマー= new Timer( "alertTimer"、true); 
 public void reScheduleTimer(int duration){
 timer.cancel(); 
タイマー。 schedule(timerTask、1000L、duration * 1000L); 
} 
35
Dijo David

Timer.cancel()のドキュメントを参照すると、次のように表示されます。

「タイマーとスケジュールされたすべてのタスクをキャンセルします。現在実行中のタスクがある場合、影響はありません。このタイマーでこれ以上タスクをスケジュールすることはできません。その後の呼び出しは何もしません。」

スケジュールを変更する場合は、新しいタイマーを初期化する必要があります。

編集:

public void reScheduleTimer(int duration) {
  timer = new Timer("alertTimer",true);
  timerTask = new MyTimerTask();
  timer.schedule(timerTask, 1000L, duration * 1000L);
}

private class MyTimerTask extends TimerTask {
  @Override
  public void run() {
    // Do stuff
  }
}
59
Eric Nordvik

実際、 cancel method javadoc を見ると、次のことがわかります。

現在実行中のタスクを妨害しません(存在する場合)。

これは、タイマーに「これ以上タスクはありませんが、実行中のタスクを完了することができます」と伝えます。 TimerTaskをキャンセルする も必要になると思います。

4
Valentin Rocher

@Eric Nordvikの回答は順調です。

私たちにできることの1つは、以前のタイマーイベントの実行をキャンセルすることです

public void reScheduleTimer(int duration) {

    // Cancel previous timer first
    timer.cancel();

    timer = new Timer("alertTimer",true);
    timerTask = new MyTimerTask();
    timer.schedule(timerTask, 1000L, duration * 1000L);
}
1
Kushal