在vaadin扫描应用程序中,我创建了一个简单的Listener:
public abstract class ScanEndListener {
public abstract void onScanTerminated();
}
在我的扫描类中,我创建了一个扫描数组:
protected final Collection<ScanEndListener> scanEndListeners = new ArrayList<ScanEndListener>();
使用扫描完成时调用的方法:
private void notifyListeners(){
for(ScanEndListener sl : scanEndListeners){
sl.onScanTerminated();
}
}
在我看来,我有一个带clickListener的按钮:
final Button startScan = new Button(FontAwesome.PLAY);
startScan.setImmediate(true);
startScan.addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
WhatWeb wat = new WhatWeb();
wat.addScanEndListener(new ScanEndListener() {
@Override
public void onScanTerminated() {
new Notification("Scan terminated").show(Page.getCurrent());
System.out.println("Scan terminated");
}
});
wat.start(site);
}
});
我的问题是,即使我在控制台中打印了“扫描已终止”,我也没有显示通知。我尝试做其他事情,比如Page.getCurrent().reload()
,但它不起作用。
我还尝试创建一个名为test的方法:
public void test(){
Page.getCurrent().reload();
}
如果我在View.enter()方法中调用test()
,它可以正常工作,但如果我在我的onScanTerminated()侦听器方法中调用它,它就不起作用。
我是Listener系统的新手,但它不像上下文问题吗?我怎样才能让它正常工作?
编辑:方法wat.start()
正在新线程中运行我的扫描,扫描结束后调用notifyListeners()
。
答案 0 :(得分:2)
如果您异步运行上面的代码,那么客户端最终只会知道状态更改。如果您想通知客户有关更改的信息,那么您必须通过Server Push执行此操作。
如果用户无论如何都要等待,那么您也可以使用Polling让客户端在给定的时间间隔内检查服务器。
如果您在此期间与用户进行了大量交互,那么您也可以使用上面的代码,因为用户最终会看到更改。在任何一种情况下,您都应该阅读上面关于Acessing UI from Another Thread
的链接Server Push
部分。