Vaadin 带有detach()方法错误的自定义侦听器
我想知道你的情况。我如何理解API中的以下定义 从会话中删除UI之前调用。 我在创建自定义侦听器时遇到问题,例如 MyCustomListener.javaVaadin 带有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
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应用程序是一项令人困惑和棘手的工作。我相信这个问题和相关的问题会对其他人很有帮助。