我有一个异步线程运行,它定期检查数据库是否发生插入。找到记录后,将加载UI。
当加载大量数据并发生重大UI更改时,UI.push()方法可以正常工作。 我遇到问题,是将Label.setValue()更改回客户端。
标签更新的代码是:
Label displayProgress;
...
private void updateProgress(final int status) {
CustomUI.getInstance().access(new Runnable() {
@Override
public void run() {
LOG.log(Level.INFO, "Running progress text update");
StringBuilder sb = new StringBuilder(100);
String desc = StateManager.getDescription(status);
Integer step = StateManager.getStatusIndex(status);
sb.append("Step ").append(step).append(" of ").append(StateManager.getStatusCount());
sb.append("\n").append(desc);
displayProgress.setValue(sb.toString());
//displayProgress.markAsDirty();
LOG.log(Level.INFO, sb.insert(0, "Progress text should be: ").toString());
CustomUI.getInstance().push();
}
});
}
我的CustomUI类添加了以下注释:
@Push(value = PushMode.MANUAL, transport = Transport.STREAMING)
此代码在异步线程内调用~10秒。日志记录显示了我期望的正确输出,但标签将永远不会显示。如果工作正常,标签可供客户查看。
我尝试过的其他实现,没有成功:
我使用的服务器是带有JVM 1.6的Apache Tomcat / 7.0.42。我无法更改或更新服务器上的任何内容,因此我仅限于修改应用程序设置和项目文件以解决此问题。希望其他人已经解决了这个问题,可以帮助我。
谢谢
答案 0 :(得分:1)
我终于找到了解决这个问题的方法。
调用Label.markAsDirty()确实有效......假设您使用的是Vaadin 7.1.1+。如果仍然使用Vaadin 7.1.0(我是),你需要先锁定会话,否则你将失败Label.markAsDirty()方法中的断言。
VaadinSession.getCurrent().lock();
Label.markAsDirty();
VaadinSession.getCurrent().unlock();