侦听器未正确启动方法
Listener not starting method properly
在 vaadin 扫描应用程序中,我创建了一个简单的监听器:
public abstract class ScanEndListener {
public abstract void onScanTerminated();
}
在我的扫描 class 中,我创建了一个扫描数组:
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);
}
});
我的问题是,即使我在控制台中打印了 "Scan terminated",我也没有显示通知。我尝试做其他事情,例如 Page.getCurrent().reload()
但它没有用。
我还尝试创建一个名为 test 的方法:
public void test(){
Page.getCurrent().reload();
}
如果我在 View.enter() 方法中调用 test()
,它工作得很好,但如果我在我的 onScanTerminated() 侦听器方法中调用它,它就不起作用。
我是 Listener 系统的新手,但这不是上下文问题吗?我该怎么做才能让它正常工作?
编辑:方法 wat.start()
是 运行 我在新线程中的扫描,当扫描完成时调用 notifyListeners()
。
如果您 运行 上面的代码是异步的,那么客户端最终只会碰巧知道状态变化。如果您想在更改发生时通知客户,则必须通过 Server Push.
执行此操作
如果用户无论如何都要等待,那么您也可以使用 Polling,让客户端在给定的时间间隔内检查服务器。
如果您在此期间与用户有大量交互,那么您也可以只使用上面的代码,因为最终用户会看到更改。无论哪种情况,您都应该阅读上面 link 关于 Server Push
.
的关于 Acessing UI from Another Thread
的部分
在 vaadin 扫描应用程序中,我创建了一个简单的监听器:
public abstract class ScanEndListener {
public abstract void onScanTerminated();
}
在我的扫描 class 中,我创建了一个扫描数组:
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);
}
});
我的问题是,即使我在控制台中打印了 "Scan terminated",我也没有显示通知。我尝试做其他事情,例如 Page.getCurrent().reload()
但它没有用。
我还尝试创建一个名为 test 的方法:
public void test(){
Page.getCurrent().reload();
}
如果我在 View.enter() 方法中调用 test()
,它工作得很好,但如果我在我的 onScanTerminated() 侦听器方法中调用它,它就不起作用。
我是 Listener 系统的新手,但这不是上下文问题吗?我该怎么做才能让它正常工作?
编辑:方法 wat.start()
是 运行 我在新线程中的扫描,当扫描完成时调用 notifyListeners()
。
如果您 运行 上面的代码是异步的,那么客户端最终只会碰巧知道状态变化。如果您想在更改发生时通知客户,则必须通过 Server Push.
执行此操作如果用户无论如何都要等待,那么您也可以使用 Polling,让客户端在给定的时间间隔内检查服务器。
如果您在此期间与用户有大量交互,那么您也可以只使用上面的代码,因为最终用户会看到更改。无论哪种情况,您都应该阅读上面 link 关于 Server Push
.
Acessing UI from Another Thread
的部分