【问题标题】:Blackberry stopwatch implementation黑莓秒表实现
【发布时间】:2011-01-25 05:20:10
【问题描述】:

我正在尝试编写一个基本上是秒表并显示单圈时间的黑莓应用程序。首先,我不确定我是否以最佳方式实现秒表功能。我有一个显示“时钟”的 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);
 }
 }
}

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

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

【问题讨论】:

  • 您是否每 1000 毫秒安排一次 TimerTask?
  • 抱歉忘记添加那部分了。我会更新信息。

标签: java user-interface blackberry multithreading stopwatch


【解决方案1】:

这里有一些提示:

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

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

【讨论】:

  • 非常感谢!!我已经根据您的所有建议对其进行了修改,并且效果更好!!!
猜你喜欢
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多