在android中重新安排计时器

时间:2011-03-07 08:18:45

标签: android timer scheduling

如何重新安排计时器。我试图取消定时器/时间任务,并使用方法再次安排它。但它显示异常错误:

Exception errorjava.lang.IllegalStateException: TimerTask is scheduled already

我使用过的代码:

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

4 个答案:

答案 0 :(得分:58)

如果你看到关于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
  }
}

答案 1 :(得分:4)

事实上,如果你查看cancel method javadoc,你可以看到以下内容:

  

不会干扰当前正在执行的任务(如果存在)。

告诉计时器“好了,现在没有更多的任务,但你可以完成你正在做的那个”。我想你还需要cancel the TimerTask

答案 2 :(得分:1)

@Eric Nordvik答案运行正常。

我们可以做的一件事是取消之前的计时器事件执行

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

答案 3 :(得分:-1)

实际上您可以使用purge(),因此您无需初始化新的Timer

  

public int purge ()

     

在API级别1中添加   从任务队列中删除所有已取消的任务。如果没有关于任务的其他引用,那么在这次调用之后,它们可以自由地被垃圾收集。

     

返回从任务队列中删除的已取消任务的数量。