假设以下场景包含A,B类和事件总线实例(可以是Guava event bus,由Google或Otto event bus,由Squ.re提供)
class A{
@Subscribe
public void onSomething(B event){
//do something
}
}
A a = new A();
eventBus.subscribe(a);
eventBus.post(new B());
// onSomething is called, everything ok
a = null;
eventBus.post(new B());
// onSomething is called again
现在,如果我运行它(仅使用Otto测试)onSomething
被调用2次。
¿事件总线是否会在调用取消注册之前保留对“a
”的引用?
更重要的是
¿如果由于某种原因我无法确定'a
'将为空的那一刻,那么事件总线将永远保留对该对象的无用引用(内存泄漏)?
答案 0 :(得分:7)
活动总线将始终拥有强大的参考。你的两个问题的答案都是肯定的。
当您将a
设置为null
时,您只需清除本地参考。 Guava和Otto都保持着强有力的参考,并要求明确注销。您将在两个事件总线中看到上述行为。
我强烈建议您将对象的注册绑定到除清除本地引用之外的其他内容。 Android活动和片段生命周期是一个显而易见的选择,close
和destroy
之类的东西也是如此 - 就像单个对象上的方法一样。