2012-07-04 43 views
1

我正在制作一个android应用程序(QR码阅读器),我需要每秒做4次动作。我决定为此使用Timer类。我发现了一个奇怪的行为:Android - Timer class

timer = new Timer(); 
timer.scheduleAtFixedRate(onTimer, 100, stn.GetStep()); 
timer.cancel(); 
timer = new Timer(); 
timer.scheduleAtFixedRate(onTimer, 100, stn.GetStep()); 

最后一行会引发错误 - java.lang.IllegalStateException: TimerTask is scheduled already。这不是很奇怪吗?

+0

我解决了它。我写了“getTimerTask()”而不是“onTimer”。 getTimerTask返回一个新的TimerTask。 –

回答

3

不,这就是它应该如何工作。 A TimerTask是一次性对象。如果您想再次安排代码,请创建一个新的TimerTask。 (见documentation

如果你不喜欢创造一个完全新的对象每次运行的想法,你可以这样做

Runnable toRunRepeatedly = new Runnable() { 
    public void run() { 
     // your code goes here... 
    } 
}; 

,然后做

TimerTask tt = new TimerTask() { 
    public void run() { 
     // Delegate to the same runnable each time. 
     toRunRepeatedly.run(); 
    } 
}; 

相关问题:

+0

我以为'新的Timer()'创建一个新的线程,这与任何其他以前的Timer实例(和线程)无关。 –

+0

哦,我看到,TimerTask不像方法,它是一个实例,它只能运行一次... –

+0

Exacly。你说对了。 – aioobe

0

简答:不,不是很奇怪。

这是一个线索,这将是在“取消”状态,但由于语句的快速执行,线程不会被取消还。因此,这不是很奇怪,欢迎线程101

为何取消线程重新调用呢?这有什么用途?在您再次调用之前,您没有给予第一时间安全停止。在重新创建之前,您可能需要将计时器对象设置为空。