如何从 Vaadin 8 中的子线程访问 UI 线程

How to get access UI thread from child thread in Vaadin 8

我以前用过Vaadin 7。在那里,我可以使用以下代码从我的子线程访问 UI 线程:

    UI.getCurrent().access(() -> {
        status.setVisible(true);
    });

但目前,我正在从 Vaadin 7 迁移到 Vaadin 8。在 Vaadin 8 UI.getCurrent() returns 中,子线程为 null。那么我们如何才能从子线程访问UI线程呢?

Vaadin 中的首选模式是应用诸如(模型视图演示器)之类的 MVP。

当您通过扩展布局创建视图时,您可以使用 getUI() 方法,当附加布局和视图时,returns 正确 UI 实例。这意味着在您的 class 实现视图中,您还可以实现更新状态的方法,例如:

updateStatus(boolean visible) {
     getUI().access(() -> {
          status.setVisible(true);
     });
}

如果您的应用程序容易出现用户急切关闭浏览器、网络状况不佳等情况,您可能希望在 try catch 和 catch 中包围 access(..) UIDetachedException,如果浏览器可能会发生连接突然断开。

您在后台线程中的进程可以安全地调用此方法,即 myView.updateStatus(true)。通常这是通过 Presenter

完成的
presenter.getView().updateStatus(true);