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()方法中添加断点时,出现以下行为:
由于我在每个地方都使用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
这更像是仅供参考。另外,请勿从传入的事件总线中手动删除任何处理程序。这是由与上述相同的错误引起的。