我正在尝试编写一个黑莓应用程序,它基本上是一个秒表,并显示单圈时间。首先,我不确定我是否以最佳方式实现秒表功能。我有一个显示“时钟”的 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);
}
}
}
无论如何,当您停止秒表时,它会更新单圈时间数据的历史表。当这个列表变长时,计时器开始退化。如果你尝试滚动,那么情况会变得非常糟糕。
有更好的方法来实现我的秒表吗?
最佳答案
这里有一些提示:
- 跟踪用于更新标签的最后一个“秒”值,如果新计算的“秒”值相同,则立即退出运行循环 - 否则您将不必要地使用相同的值刷新 UI这会减慢一切
- 删除运行循环中的同步,只需将修改 UI(setText 调用)的代码放入 UiApplication.getUiApplication.invokeLater() 调用(使用匿名 Runnable)
- 不要从屏幕或管理器中删除或重新添加标签,您只需要调用 setText() 它就会更新 - 如果没有更新,则在字段上调用 invalidate() ,它就会重绘
- 现在您已经优化了代码并最大程度地减少了实际 UI 绘制量,可以安全地将计时器任务间隔设置为较低的值(例如 50 毫秒),以便获得更流畅的计时器更新
在制作快速 UI 时要记住的最重要的事情是仅在需要时更新 UI,并且仅更新需要更改的字段。如果你调用像deleteAll()这样的方法,你最终会刷新整个屏幕或管理器,这真的很慢。
关于java - 黑莓秒表实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2405569/