具有detach()方法错误的自定义侦听器

时间:2014-07-28 09:16:53

标签: vaadin vaadin7

我想知道Vaadin's detach() method。我如何从API理解以下定义?

  

在从会话中删除用户界面之前调用。

创建自定义侦听器时遇到问题,例如BroadCaster

MyCustomListener.java

public interface MyCustomListener {
void fireEvent(MyCustomEvent event);
}

MyCustomEvent.java

public class MyCustomEvent {
private String message;

public MyCustomEvent(final String message) {
    this.message = message;
}

public final String getMessage() {
    return message;
}
}

MyCustomDispatcher.java

public final class MyCustomDispatcher {
private static LinkedList<MyCustomListener> customListeners = new LinkedList<MyCustomListener>();
private static ExecutorService executorService = Executors.newSingleThreadExecutor();

private MyCustomDispatcher() {

}

public static synchronized void register(final MyCustomListener listener) {
    customListeners.add(listener);
}

public static synchronized void unregister(final MyCustomListener listener) {
    customListeners.remove(listener);
}

public static synchronized void invokeMyCustomEvent(final String message) {
    if (message == null || message.trim().length() <= 0) {
        return;
    }

    for (final MyCustomListener listener : customListeners) {
        executorService.execute(new Runnable() {
            public void run() {
                listener.fireEvent(new MyCustomEvent(message));
            }
        });
    }
}
}

我从我的UI类中调用此侦听器为...

public class HelloWorldUI extends UI implements MyCustomListener {

@Override
protected void init(VaadinRequest request) {
    System.out.println("Getting initialized !");
    MyCustomDispatcher.register(this);
    final VerticalLayout layout = new VerticalLayout();
    layout.setMargin(true);
    setContent(layout);
    setSizeFull();
    layout.addComponent(new Label("Hello World !"));
}

@Override
public void detach() {
    System.out.println("Listener was Unregister !");
    MyCustomDispatcher.unregister(this);
    super.detach();
}

@Override
public void fireEvent(MyCustomEvent event) {
    // Do Something
}
}

我在detach()方法中调用我的自定义侦听器的 unregister()方法

  1. 来自自定义侦听器的一些示例
  2. 以避免接收不再使用的UI的消息(并确保可以对分离的UI进行垃圾回收)。
  3. Cleaning up resources in a UI
  4. 我的问题是由detach()方法引起的,因为当我刷新浏览器时,我的侦听器实例被删除了(来自detach()方法)。所以,我不能再获得fireEvent()了。我调试后,在刷新浏览器时,在我的UI的detach()方法之后调用了init()方法。但是,如果我从unregister(MyCustomListener listener)方法中删除调用detach(),则可能会导致嵌套事件(以前的侦听器仍处于活动状态)。

    我错了什么?我该如何解决?有什么建议吗?

1 个答案:

答案 0 :(得分:1)

抱歉!这是一个愚蠢的问题。 Vaadin的组件是服务器端代码,我应尽量避免使用 static 。当我将自定义侦听器用作 static-resources 时,这些事件与其他所有人共享。如果某人调用了一个事件,那么每个用户都会得到相同的信息。

侦听器的静态集合(共享事件)可能仅适用于server-push

我不应该像这样创建自定义侦听器。 感谢@HenriKerola对using static fields in vaadincreating new UI instance when browser was refresh的解释。