从其他视图更新 UI(Vaadin 版本 7.7.12)

Update UI from other view (Vaadin-version 7.7.12)

目前我面临更新UI的问题,从另一个角度来看场景如下

public class myWindow extends Window{

private UI ui;

@Autowired
private AbcPresenter abcpresenter;

@Override
    public void attach() {
        super.attach();
        ui = getUI();
    }

private void saveData(){
    ui.setPollInterval(1000);
        mainUI.showSpinner();//Vaadin progressbar setting visible true
         abcpresenter.saveData(param,param);
         UI.setCurrent(ui);
        close();
}

public void notifyUsers(){
try{
ui.access(() -> {
           mainUI. .hideSpinner();//hide vaadin progress bar
            Notification.show("Task done"));
        });
}catch(Exception e){
    e.printStackTrace();
}

}   

}

//here is my presenter
public class AbcPresenter(){

@Async
public void saveData(args...){
    //saving action done then notify again to myWindow class
    myWindow.notifyUsers();

}

如果我在当前视图中,但如果我导航到其他视图,我将无法收到通知,但问题仍然存在,但它仍然有效..!!

@Async 会不会有问题?

我担心线程无法通信,因为根据代码,它将是 2 个线程,就像缺少某些东西一样,不会向服务器请求 UI 更新,因为一旦进程启动并且如果用户导航到其他视图(我有一个侧边栏,我从当前视图导航到其他视图(其中进程在后台 运行)我看不到通知。

我怀疑以下事情..!! 1)window的关闭(我调用的是notify方法) 2)@Async注解 3)服务器更新线程之间的通信

我通过多次尝试和错误解决了这个问题。

首先有必要了解一下vaadin中push和poll的区别

I used poll which means the client was requesting server every one second for the update.

但我的情况有所不同,就像我将进程 运行 保留在后台线程中并且我需要在我的应用程序中的任何 UI 中更新进程已完成..!!

所以为此我需要推送机制,服务器在工作完成后通知客户端..!!

我尝试了手动推送和自动推送

通过下面的代码加入pom.xml

<dependency>
        <groupId>com.vaadin</groupId>
        <artifactId>vaadin-push</artifactId>
</dependency>

下一步是添加 In MainUI class 扩展 UI

代码如下

@Push
@SpringUI
public class MainUI extends UI {
}

然后我尝试了像PushMode.MANUAL和PushMode.AUTOMATIC这样的推送模式,代码如下

@Push(value = PushMode.MANUAL)
@SpringUI
public class MainUI extends UI {
}

@Push(value = PushMode.AUTOMATIC)
@SpringUI
public class MainUI extends UI {
}

仅此一项行不通,所以运输模式对我有用运输=Transport.LONG_POLLING

代码如下 PushMode 我保持手动最好保持MANUAL

@Push(value = PushMode.MANUAL, transport = Transport.LONG_POLLING)
@SpringUI
public class MainUI extends UI {
}

Transport.LONG_POLLING服务器和客户端之间是否保持了一个长的Get请求以进行更新..!!

我手动推送的方法是

public void notifyUsers() {
        getUI().access(() -> {
        mainUI.hideSpinner();
        Notification.show.info("Task done");
        ui.push();
      });
   }

希望我的解释对你有帮助..!!