2010-03-08 32 views
2

我正在尝试写一个基本上是秒表的黑莓应用程序,并显示单圈时间。首先,我不确定我是否以最佳方式实施秒表功能。我有一个显示'时钟'的LabelField(_myLabel) - 从00:00开始。然后你点击开始按钮,每秒钟_myLabel字段得到更新,自上次更新以来已经过去了多少秒(应该只增加1,但有时会有延迟,并且会跳过一个数字)。我只是想不到一种不同的方式来做到这一点 - 而且我对GUI开发和线程很陌生,所以我想这就是为什么。黑莓秒表的执行

编辑:这是什么叫秒表:当你停止更新单圈时间数据的历史表秒表

class MyTimerTask extends TimerTask { 
long currentTime; 
long startTime = System.currentTimeMillis(); 

public void run() { 
synchronized (Application.getEventLock()) { 
currentTime = System.currentTimeMillis(); 
long diff = currentTime - startTime; 
long min = diff/60000; 
long sec = (diff % 60000)/1000; 
String minStr = new Long(min).toString(); 
String secStr = new Long(sec).toString(); 

if (min < 10) 
minStr = "0" + minStr; 
if (sec < 10) 
secStr = "0" + secStr; 

_myLabel.setText(minStr + ":" + secStr); 
timerDisplay.deleteAll(); 
timerDisplay.add(_timerLabel); 
} 
} 
} 

总之:

_timer = new Timer(); 
_timer.schedule(new MyTimerTask(), 250, 250); 

这里是TimerTask的。当这个列表变长时,计时器开始降级。如果你尝试滚动,那么它会变得非常糟糕。

有没有更好的方法来实现我的秒表?

+2

您是否每1000个msecs计划一次TimerTask? – Jack 2010-03-08 23:27:46

+0

很抱歉忘记了添加该零件。我会更新信息。 – Michaela 2010-03-09 00:07:26

回答

3

这里有几个技巧:用于更新标签的最后一个“秒”值的

  • 跟踪,并退出运行循环立即如果新计算出的“秒”值相同 - 否则你不必要地用相同的值刷新UI,这会降低所有的速度
  • 删除你的运行循环中的同步,并将修改UI(setText调用)的代码放在UiApplication.getUiApplication.invokeLater()调用中(使用匿名Runnable)
  • 不要删除重新添加标签从屏幕或者宏,你只是n eed来调用setText(),它应该更新 - 如果它没有更新,然后在该字段上调用invalidate(),并且现在将重新绘制
  • 现在,您已经优化了代码并最小化了实际的UI绘制量,它是安全的TimerTask的间隔设置为较低的值,如50毫秒,让你有一个平滑的定时更新

在作出快速的用户界面是只更新,当您需要的UI需要记住的最重要的事情并且只更新需要更改的字段。如果你调用deleteAll()这样的方法,你将最终导致整个屏幕或管理器刷新,这真的很慢。

+0

非常感谢你!我修改了它的所有建议,它工作得更好!!! – Michaela 2010-03-09 14:53:19