Я столкнулся с этой проблемой в большой программе, поэтому я написал небольшой образец, чтобы проверить его. Я надеюсь, кто-то сможет мне это объяснить.GWT - событие вызова EventBus для объекта, который больше не существует
Вот код:
EventBus bus = new SimpleEventBus();
class TestClass {
TestClass() {
bus.addHandler(TestEvent.TYPE, new TestHandler() {
@Override
public void onEvent(TestEvent event) {
System.out.println("test");
}
});
}
}
class TestEvent extends GwtEvent<TestHandler> {
public static final GwtEvent.Type<TestHandler> TYPE = new GwtEvent.Type<TestHandler>();
@Override
public Type<TestHandler> getAssociatedType() {
return TYPE;
}
@Override
protected void dispatch(TestHandler handler) {
handler.onEvent(this);
}
}
interface TestHandler extends EventHandler {
void onEvent(TestEvent event);
}
После чего я делаю следующее:
TestClass c1 = new TestClass();
c1 = new TestClass();
bus.fireEvent(new TestEvent());
Теперь по моей логике, выход к этому должен быть один «тест»; на самом деле, это два «теста», обработчик называется дважды. Я действительно не понимаю, почему это так; c1 - это единственный объект, поэтому обработчик не должен вызываться один раз?
Не следует ли очищать сборщик мусора первым 'TestClass', когда я удаляю ссылку из него? Почему это сохраняется? – Marconius
Первый «TestClass» по-прежнему ссылается на его анонимный «TestHandler», зарегистрированный на шине, поэтому он не может быть GC'd. WBut действительно имеет значение «TestHandler», и вы никогда не удаляете его из шины, поэтому автобус все еще знает об этом, и он не будет GC'd и будет уведомлен о событиях. –