侦听器未正确启动方法

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 的部分