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()方法中添加断点时,出现以下行为:
  • 在第一个地方,对于触发
  • 的每个事件,我只能中断一次
  • 地点更改后,我两次破了
  • 换了另外3次。...

  • 由于我在每个地方都使用MyActivity的新实例,因此我猜测我会分裂成几个MyActivity实例。 ResettableEventBus应该在每次场所更改时注销所有处理程序。

    我想念什么吗?

    最佳答案

    使用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);
        }
    }
    

    如果您使用在“开始”中传递给您的eventBus,ActivityManager将自动为您自动清除附加到它的处理程序。

    我也建议在您的工厂中构造一个SimpleEventBus而不是ResettableEventBus。当前版本的ResettableEventBus中有一个错误,如果您将其嵌套(内存泄漏),则会引起问题。

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

    这更像是仅供参考。另外,请勿从传入的事件总线中手动删除任何处理程序。这是由与上述相同的错误引起的。

    10-04 22:14