Java 黑莓秒表的实现
我正在尝试编写一个黑莓应用程序,它基本上是一个秒表,并显示圈速。首先,我不确定我是否以最佳方式实现了秒表功能。我有一个LabelField(_myLabel),显示从00:00开始的“时钟”。然后点击开始按钮,每隔一秒钟,_myLabel字段就会更新自上次更新以来已过的秒数(应该只增加1,但有时会有延迟,它会跳过一个数字)。我只是想不出一种不同的方法来实现它——我对GUI开发和线程还不熟悉,所以我想这就是原因 编辑:以下是所谓的秒表:Java 黑莓秒表的实现,java,user-interface,blackberry,multithreading,stopwatch,Java,User Interface,Blackberry,Multithreading,Stopwatch,我正在尝试编写一个黑莓应用程序,它基本上是一个秒表,并显示圈速。首先,我不确定我是否以最佳方式实现了秒表功能。我有一个LabelField(_myLabel),显示从00:00开始的“时钟”。然后点击开始按钮,每隔一秒钟,_myLabel字段就会更新自上次更新以来已过的秒数(应该只增加1,但有时会有延迟,它会跳过一个数字)。我只是想不出一种不同的方法来实现它——我对GUI开发和线程还不熟悉,所以我想这就是原因 编辑:以下是所谓的秒表: _timer = new Timer(); _timer.s
_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);
}
}
}
类MyTimerTask扩展了TimerTask{
长时间;
long startTime=System.currentTimeMillis();
公开募捐{
已同步(Application.getEventLock()){
currentTime=System.currentTimeMillis();
长差异=当前时间-开始时间;
长最小值=差值/60000;
长秒=(差值%60000)/1000;
字符串minStr=new Long(min).toString();
字符串secStr=新长(秒).toString();
如果(最小值<10)
minStr=“0”+minStr;
如果(第10节)
secStr=“0”+secStr;
_myLabel.setText(minStr+“:”+secStr);
timerDisplay.deleteAll();
timerDisplay.add(_timerLabel);
}
}
}
无论如何,当您停止秒表时,它会更新圈速数据的历史表。当此列表变长时,计时器开始降级。如果你试图滚动,那么它会变得非常糟糕
有没有更好的方法来实现我的秒表 以下是一些提示:
- 跟踪用于更新标签的最后一个“秒”值,如果新计算的“秒”值相同,则立即退出运行循环-否则您将不必要地使用相同的值刷新UI,这会降低速度
- 删除运行循环中的同步,只需将修改UI的代码(setText调用)放入UiApplication.getUiApplication.invokeLater()调用中(使用匿名Runnable)
- 不要从屏幕或maanger中删除“重新添加标签”,只需调用setText(),它应该会更新-如果不更新,则在字段上调用invalidate(),它将被重新绘制
- 现在,您已经优化了代码并最小化了实际的UI绘图量,可以安全地将timertask间隔设置为较低的值,例如50ms,这样您就可以进行更平滑的计时器更新
在创建快速用户界面时,最重要的一点是只在需要时更新用户界面,并且只更新需要更改的字段。如果调用deleteAll()之类的方法,则整个屏幕或管理器的刷新速度会非常慢。是否每1000毫秒安排一次此时间任务?抱歉,忘了添加该部分。我会更新信息的。非常感谢!!我用你所有的建议修改了它,它工作得更好!!!