监听器无法正确启动方法

时间:2015-01-21 14:56:01

标签: java-ee vaadin

在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()

1 个答案:

答案 0 :(得分:2)

如果您异步运行上面的代码,那么客户端最终只会知道状态更改。如果您想通知客户有关更改的信息,那么您必须通过Server Push执行此操作。

如果用户无论如何都要等待,那么您也可以使用Polling让客户端在给定的时间间隔内检查服务器。

如果您在此期间与用户进行了大量交互,那么您也可以使用上面的代码,因为用户最终会看到更改。在任何一种情况下,您都应该阅读上面关于Acessing UI from Another Thread的链接Server Push部分。