2013-07-11 25 views
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是單個對象,所以不應該只調用一次處理程序?

回答

1

您創建了TestClass的兩個實例,通過c1引用後者。在每個實例化過程中,匿名處理程序被添加到您的單個全局總線中。因此,有兩輛公交車在其收藏中具有處理程序,並且在您開火時呼叫TestEvent,因此有兩個「測試」。

+0

當我從中刪除引用時,不應該由垃圾回收器清理第一個「TestClass」?爲什麼持續? – Marconius

+1

第一個'TestClass'仍然被它的匿名'TestHandler'引用到總線上,所以它不能被GC'd。但重要的是'TestHandler',你永遠不會將它從公共汽車上移走,所以公共汽車仍然知道它,它不會被GC'd,並會通知事件。 –