如何在Vaadin 8中从子线程获取访问UI线程

时间:2018-07-02 13:32:32

标签: java multithreading vaadin8

我以前使用过Vaadin 7。我可以使用以下代码从子线程访问UI线程:-

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

但是目前,我正在从Vaddin 7迁移到Vaadin8。在Vaadin 8中,UI.getCurrent()从子线程中返回null。那么如何从子线程访问UI线程呢?

1 个答案:

答案 0 :(得分:2)

Vaadin中的首选模式是应用MVP之类的东西(例如Model View Presenter)。

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

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

如果您的应用程序容易导致用户急于关闭浏览器,不良的网络状况等,您可能希望将access(..)包含在try catch and catch UIDetachedException中,如果浏览器突然断开连接,可能会发生这种情况。 >

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

presenter.getView().updateStatus(true);