0
我在一個大程序中遇到了這個問題,所以我寫了一個小樣本來測試它。我希望有人能向我解釋這一點。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。但重要的是'TestHandler',你永遠不會將它從公共汽車上移走,所以公共汽車仍然知道它,它不會被GC'd,並會通知事件。 –