黑莓秒表实施

时间:2010-03-08 23:24:31

标签: java user-interface blackberry multithreading stopwatch

我正在尝试编写一款基本上是秒表的黑莓应用程序,并显示单圈时间。首先,我不确定我是否以最佳方式实施秒表功能。我有一个显示'时钟'的LabelField(_myLabel) - 从00:00开始。然后你点击开始按钮,_myLabel字段每秒都会更新自上次更新以来经过的秒数(应该只增加1,但有时会有延迟,它会跳过一个数字)。我只是想不出一种不同的方式 - 我是GUI开发和线程的新手,所以我想这就是原因。

编辑:这是调用秒表的原因:

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

这是TimerTask:

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

无论如何,当你停止秒表时,它会更新一圈时间数据的历史表。当此列表变长时,计时器开始降级。如果你试图滚动,那就非常糟糕。

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

1 个答案:

答案 0 :(得分:3)

以下是一些提示:

  • 跟踪用于更新标签的最后一个“sec”值,如果新计算的“sec”值相同,则立即退出运行循环 - 否则您将不必要地刷新具有相同值的UI这减缓了一切
  • 删除运行循环中的同步,只需将修改UI的代码(setText调用)放入UiApplication.getUiApplication.invokeLater()调用(使用匿名Runnable)
  • 不要删除从屏幕或maanger重新添加标签,你只需要调用setText()并且它应该更新 - 如果它没有更新,那么在字段上调用invalidate()它将是重绘
  • 既然您已经优化了代码并最大限度地减少了实际UI绘图的数量,那么将时间间隔设置为较低的值(例如50ms)是安全的,这样您可以更顺畅地更新计时器

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