如何在代号一中刷新 UI 上的计数器而不阻塞其余计数器?
How to refresh a counter on the UI without blocking the rest, in codename one?
我尝试在 UI 上获取分数计数,每秒刷新几次。刷新不应阻止 UI 的其他元素正常工作(按钮应保持可点击等)
我阅读了 EDT
上的文档并尝试添加一个从 Form
的构造函数调用的方法:
private void loopScore() {
Display.getInstance().callSerially(
() -> {
while (true) {
try {
MyApplication.score = MyApplication.score + 1;
this.gui_Score.setText(String.valueOf(MyApplication.score));
Thread.sleep(100);
} catch (InterruptedException ex) {
//do something
}
}
});
}
但这不会更新 gui_Score
并且会阻塞 UI 的其余部分。有帮助吗?
一个解决方案是覆盖 Form
的 animate
方法。
此方法在 EDT
的每个新周期(大约每毫秒)调用一次,以验证是否需要重新绘制任何内容。
重写该方法允许插入一行代码更新 Label
的文本,其中分数为:
@Override
public boolean animate() {
if (System.currentTimeMillis() / 1000 > lastRenderedTime / 1000) {
lastRenderedTime = System.currentTimeMillis();
computeScore();
this.gui_Score.setText(String.valueOf(MyApplication.score));
return true;
}
return false;
}
private void computeScore() {
MyApplication.score = MyApplication.score + 3;
}
然后,你需要用registerAnimated
方法注册这个动画。我从 Form
:
的构造函数中完成
public Form1(com.codename1.ui.util.Resources resourceObjectInstance) {
initGuiBuilderComponents(resourceObjectInstance);
lastRenderedTime = System.currentTimeMillis();
registerAnimated(this);
}
现在带有计数器的 Label
每秒刷新一次,增量为 3。UI 的其余部分保持响应,没有任何阻塞。
(通过摆弄时钟动画找到的解决方案demonstrated on this page)
我尝试在 UI 上获取分数计数,每秒刷新几次。刷新不应阻止 UI 的其他元素正常工作(按钮应保持可点击等)
我阅读了 EDT
上的文档并尝试添加一个从 Form
的构造函数调用的方法:
private void loopScore() {
Display.getInstance().callSerially(
() -> {
while (true) {
try {
MyApplication.score = MyApplication.score + 1;
this.gui_Score.setText(String.valueOf(MyApplication.score));
Thread.sleep(100);
} catch (InterruptedException ex) {
//do something
}
}
});
}
但这不会更新 gui_Score
并且会阻塞 UI 的其余部分。有帮助吗?
一个解决方案是覆盖 Form
的 animate
方法。
此方法在 EDT
的每个新周期(大约每毫秒)调用一次,以验证是否需要重新绘制任何内容。
重写该方法允许插入一行代码更新 Label
的文本,其中分数为:
@Override
public boolean animate() {
if (System.currentTimeMillis() / 1000 > lastRenderedTime / 1000) {
lastRenderedTime = System.currentTimeMillis();
computeScore();
this.gui_Score.setText(String.valueOf(MyApplication.score));
return true;
}
return false;
}
private void computeScore() {
MyApplication.score = MyApplication.score + 3;
}
然后,你需要用registerAnimated
方法注册这个动画。我从 Form
:
public Form1(com.codename1.ui.util.Resources resourceObjectInstance) {
initGuiBuilderComponents(resourceObjectInstance);
lastRenderedTime = System.currentTimeMillis();
registerAnimated(this);
}
现在带有计数器的 Label
每秒刷新一次,增量为 3。UI 的其余部分保持响应,没有任何阻塞。
(通过摆弄时钟动画找到的解决方案demonstrated on this page)