具有空引用的Guava / Otto EventBus

时间:2013-07-07 04:49:40

标签: java android guava event-bus otto

假设以下场景包含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'将为空的那一刻,那么事件总线将永远保留对该对象的无用引用(内存泄漏)?

1 个答案:

答案 0 :(得分:7)

活动总线将始终拥有强大的参考。你的两个问题的答案都是肯定的。

当您将a设置为null时,您只需清除本地参考。 Guava和Otto都保持着强有力的参考,并要求明确注销。您将在两个事件总线中看到上述行为。

我强烈建议您将对象的注册绑定到除清除本地引用之外的其他内容。 Android活动和片段生命周期是一个显而易见的选择,closedestroy之类的东西也是如此 - 就像单个对象上的方法一样。