Blackberry TimerTask不按预定间隔执行
我正在为BlackBerry编写一个秒表应用程序(类似于BlackBerry内置的秒表)。有一个计时器标签,以MM:SS:T(分、秒、秒的十分之一)的格式显示当前时间。标签使用TimerTask每100毫秒刷新一次 应用程序运行良好,时间显示正确,但有时计时器标签未按预定间隔(每100毫秒)更新。计时器标签暂停(不计数)一段时间,然后继续计数(同时仍然正确显示时间) 我的想法是,在暂停期间,不会执行TimerTask来更新计时器标签。你知道为什么应用程序会这样,以及如何修复它吗 下面是更新计时器标签的线程:Blackberry TimerTask不按预定间隔执行,blackberry,timer,Blackberry,Timer,我正在为BlackBerry编写一个秒表应用程序(类似于BlackBerry内置的秒表)。有一个计时器标签,以MM:SS:T(分、秒、秒的十分之一)的格式显示当前时间。标签使用TimerTask每100毫秒刷新一次 应用程序运行良好,时间显示正确,但有时计时器标签未按预定间隔(每100毫秒)更新。计时器标签暂停(不计数)一段时间,然后继续计数(同时仍然正确显示时间) 我的想法是,在暂停期间,不会执行TimerTask来更新计时器标签。你知道为什么应用程序会这样,以及如何修复它吗 下面是更新计时器
public class ThreadUpdateTime extends Thread
{
private MyMainScreen myMainScreen;
private Timer updateTimerLabelTimer = new Timer();
public ThreadUpdateTime(MyMainScreen parent)
{
myMainScreen=parent;
}
public void run()
{
try {
updateTimerLabelTimer.schedule(new RecordTimer(myMainScreen), TIMER_DELAY, TIMER_INTERVAL);
} catch (Exception e) {
//put alert here
}
}
public void iStop()
{
updateTimerLabelTimer.cancel();
}
}
timerTask:
public class RecordTimer extends TimerTask
{
private MyMainScreen myMainScreen;
public RecordTimer(MyMainScreen parent)
{
myMainScreen=parent;
}
public void run()
{
myMainScreen.iUpdateTimerLabel();
}
}
以及iUpdateTimerLabel方法:
public void iUpdateTimerLabel()
{
//calculate : sign, sMin, sSec, sTenth
synchronized(Application.getEventLock())
{
lblSpotTime.setText(sign+sMin+":"+sSec+"."+sTenth+" ");
}
}
首先是测量它。。。记录timertask开始和结束时的时间戳,看看这是否真的是问题所在。有了这些,我想到的几件事是
计时器
实例?我不知道它是否是这样指定的,但是任务可能都在一个线程上运行,因此如果另一个任务妨碍了您,您的任务可能不会在指定的确切时间间隔内运行TimerTask
是否与UI事件循环正确同步(即,它是否以正确的runLater()
或blackberry UI提供的任何方法更新标签)?如果不这样做,UI事件循环可能不会注意到您已更改了标签。我认为在Blackberry上,正确的做法是或者可能是invokeAndWait()
,这取决于您试图实现的目标schedule()
调用在它自己的Runnable
内。。。你不需要这样,但也许你的应用程序正在这样做,因为我看不出什么原因。如果您认为您正在为计时器创建一个显式线程,那么您不是。您可能只需创建计时器
,然后从任何应用程序线程中调用schedule()
Timer
包含一个执行这项工作的捕获线程,引入另一个线程可能是多余的和令人困惑的TimerTask中的代码
:
public void iUpdateTimerLabel()
{
//calculate : sign, sMin, sSec, sTenth
// synchronized(Application.getEventLock())
UiApplication.getUiApplication().invokeLater(
new Runnable() {
@Override
public void run() {
lblSpotTime.setText(sign+sMin+":"+sSec+"."+sTenth+" ");
}
});
}
您的synchronized
呼叫可能足以防止事情爆发,但这并不是首选的方法。如果Timer
线程专用于此单一用途,那么如果愿意,您可能可以将invokeAndWait()
替换为invokeAndWait()
其他人可能能够解释仅仅持有UI锁和实际在UI线程上运行之间的区别,但我猜后者会强制执行
无效()
,而前者不会。这可以解释为什么标签更改只是偶尔出现。建议您发布TimerTask
的代码以及提交给计时器的代码。这可能与计时器无关,尤其是。参见相关内容:你好,安德森,我刚刚发布了我的代码。你能指出我可能遗漏了什么吗。谢谢。我已经尝试了“invokeLater()”并且得到了相同的结果,我可能需要测量计时器。谢谢你的帮助。@Tuyen Nguyen:让我们知道你发现了什么。我肯定还遗漏了什么。这是该应用程序的完整源代码:该项目是使用BlackBerry JDE Eclipse插件、JRE 5.0.0、模拟器BlackBerry Storm开发的。希望任何人都能看到问题所在。