我们有一个 Vaadin 8 应用程序,它使用 @Push 功能将数据推送到应该异步加载的 UI。
为了加载数据,我们创建了一个在 Executor 中执行的 Runnable,然后对 UI/View 中的函数进行回调,这里代码被调用:
UI ui = getUI();
if (!isAttached() || ui.getSession().hasLock()) {
MainViewComponentImpl.this.componentImpl.getSomeComponent().setVisible(true);
MainViewComponentImpl.this.componentImpl.getSomeComponent().setItems(someHashMap.keySet());
} else {
ui.access(new Runnable() {
@Override
public void run() {
MainViewComponentImpl.this.componentImpl.getSomeComponent().setVisible(true);
MainViewComponentImpl.this.componentImpl.getSomeComponent().setItems(someHashMap.keySet());
}
});
}
如果加载数据的 Runnable 有一个Thread.sleep(TimeUnit.SECONDS.toMillis(15))
before 做回调,那么数据实际上是异步推送到 UI 中的,但如果没有,UI 会挂起并一起加载。
我的第一印象是,if/else 检查 UI 是否仍在加载,是否可以将数据添加到当前加载中,但即使我们取消注释 if 子句并始终使用 ui.access() 方法,数据是同步加载的。此外,即使使用超时,它也严重依赖于构建,无论数据是否实际上是异步加载的。在 maven-update、clean 项目和 maven 构建之后,大多数时候它是异步的,但并非总是如此。
有没有人经历过类似的行为并使它起作用?
谢谢