2011-01-19 53 views
3
public class MyActivity extends AbstractActivity implements ContextChangedEvent.Handler 
{ 
    public MyActivity() 
    { 
     ClientFactory.INSTANCE.getEventBus().addHandler(ContextChangedEvent.TYPE, this); 
    } 

    @override 
    public void onContextChanged() 
    { 
     //do stuff 
    } 
} 



//The getEventBus Implementation: 
public EventBus getEventBus() 
{ 
    if (eventBus == null) 
     eventBus = new ResettableEventBus(new SimpleEventBus()); 
    return eventBus; 
} 

當我在onContextChange()方法中添加一個斷點,我得到以下行爲:GWT 2.1:ResettableEventBus不重置?

  • 第一個地方,我打破只有一次,每個事件發射
  • 後的地方改變,我接連發生變化,3次破發兩次
  • ....

由於我使用MyActivity每個地方的新實例,我的猜測是,我在幾個破MyActivity的實例。 ResettableEventBus應該取消每個地點更改的所有處理程序的註冊。

我錯過了什麼?

回答

3

對於ResettableEventBus,您仍然需要調用removeHandlers(複數)來分離所有內容。 ResettableEventBus僅跟蹤您的處理程序並添加一個函數以刪除所有連接到此實例的處理程序。

如果您正在使用ActivityManager並傳入您的事件總線,ActivityManager會將您的EventBus封裝在ResettableEventBus中並在開始時傳遞給您。

ActivityManager(myActivityMap, ClientFactory.INSTANCE.getEventBus()); 

... 

public class MyActivity extends AbstractActivity implements ContextChangedEvent.Handler 
{ 
    public MyActivity() 
    { 
    } 

    @override 
    public void onContextChanged() 
    { 
     // do Stuff 
    } 

    @override 
    public void start(AcceptsOneWidget panel, EventBus eventBus) { 
     eventBus.addHandler(ContextChangedEvent.TYPE, this); 
    } 
} 

如果您使用在「start」中傳遞給您的eventBus,ActivityManager會自動爲您自動清理附加給它的處理程序。

此外,我會建議在您的工廠而不是ResettableEventBus構建一個SimpleEventBus。當前版本的ResettableEventBus中存在一個錯誤,如果您嵌套它(內存泄漏),則會導致問題。

http://code.google.com/p/google-web-toolkit/issues/detail?id=5700

這更多的是一種供參考。也不要從傳入的事件總線中手動刪除任何處理程序。這是由與上面相同的錯誤引起的。