从其他视图更新 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();
});
}
希望我的解释对你有帮助..!!
目前我面临更新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();
});
}
希望我的解释对你有帮助..!!