如何重新安排计时器。我试图取消定时器/时间任务,并使用方法再次安排它。但它显示异常错误:
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); }
答案 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中添加 从任务队列中删除所有已取消的任务。如果没有关于任务的其他引用,那么在这次调用之后,它们可以自由地被垃圾收集。
返回从任务队列中删除的已取消任务的数量。