我想知道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()方法
我的问题是由detach()
方法引起的,因为当我刷新浏览器时,我的侦听器实例被删除了(来自detach()方法)。所以,我不能再获得fireEvent()
了。我调试后,在刷新浏览器时,在我的UI的detach()
方法之后调用了init()
方法。但是,如果我从unregister(MyCustomListener listener)
方法中删除调用detach()
,则可能会导致嵌套事件(以前的侦听器仍处于活动状态)。
我错了什么?我该如何解决?有什么建议吗?
答案 0 :(得分:1)
抱歉!这是一个愚蠢的问题。 Vaadin的组件是服务器端代码,我应尽量避免使用 static 。当我将自定义侦听器用作 static-resources 时,这些事件与其他所有人共享。如果某人调用了一个事件,那么每个用户都会得到相同的信息。
侦听器的静态集合(共享事件)可能仅适用于server-push。
我不应该像这样创建自定义侦听器。 感谢@HenriKerola对using static fields in vaadin和creating new UI instance when browser was refresh的解释。