2

我们有一个 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 构建之后,大多数时候它是异步的,但并非总是如此。

有没有人经历过类似的行为并使它起作用?

谢谢

4

0 回答 0