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

Vaadin 带有detach()方法错误的自定义侦听器,vaadin,vaadin7,Vaadin,Vaadin7,我想知道你的情况。我如何理解API中的以下定义 从会话中删除UI之前调用。 我在创建自定义侦听器时遇到问题,例如 MyCustomListener.java public interface MyCustomListener { void fireEvent(MyCustomEvent event); } public class MyCustomEvent { private String message; public MyCustomEvent(final String message

我想知道你的情况。我如何理解API中的以下定义

从会话中删除UI之前调用。

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

MyCustomListener.java

public interface MyCustomListener {
void fireEvent(MyCustomEvent event);
}
public class MyCustomEvent {
private String message;

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

public final String getMessage() {
    return message;
}
}
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));
            }
        });
    }
}
}
MyCustomEvent.java

public interface MyCustomListener {
void fireEvent(MyCustomEvent event);
}
public class MyCustomEvent {
private String message;

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

public final String getMessage() {
    return message;
}
}
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));
            }
        });
    }
}
}
MyCustomDispatcher.java

public interface MyCustomListener {
void fireEvent(MyCustomEvent event);
}
public class MyCustomEvent {
private String message;

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

public final String getMessage() {
    return message;
}
}
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));
            }
        });
    }
}
}
我在的
detach()方法中调用自定义侦听器的unregister()方法

  • 来自自定义侦听器的一些示例
  • 避免接收不再使用的UI的消息(并确保可以对分离的UI进行垃圾收集)
  • 我的问题是由于
    detach()
    方法造成的,因为当我刷新浏览器时,我的侦听器实例被删除(从detach()方法)。因此,我无法再获取
    firevent()
    。我调试了,
    detach()
    方法在刷新浏览器时在我的UI的
    init()
    方法之后被调用。但是如果我从
    detach()
    方法中删除调用
    unregister(MyCustomListener listener)
    ,可能会导致嵌套事件(以前的侦听器仍然处于活动状态)


    我怎么了?我怎样才能修好它?有什么建议吗?

    对不起!这是个愚蠢的问题。Vaadin的组件是服务器端代码,我应该尽量避免使用static。当我将自定义侦听器用作静态资源时,这些事件将共享所有其他事件。如果有人调用一个事件,每个用户都会得到相同的结果

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

    我不应该像这样创建自定义侦听器。
    感谢@HenriKerola对问题的解释。

    至少我不明白你到底有什么问题。你能解释清楚吗?谢谢@HenriKerola我的问题是,当浏览器刷新时,我的
    detach()
    方法删除了我的侦听器实例。基于以上三个事实,我从
    detach()
    方法调用
    unregister()
    。我确信如果我不刷新浏览器,我的程序就正常了。刷新会为选项卡创建一个新的UI实例。这就是你看到的行为吗?旧实例将被分离,但不会立即分离。@HenriKerola先生!我已经为它打开了。请给我解释一下什么是
    。。。旧实例将被分离,但不会立即分离。
    ?@Cataclysm对于另一个问题,您可能对此感兴趣。我使用一个事件总线()来保存对通过Push发布的新数据事件感兴趣的小部件/布局,而不是捕获
    detach
    。在高度线程化的环境中编程web应用程序是一项令人困惑和棘手的工作。我相信这个问题和相关的问题会对其他人很有帮助。