具有空引用的Guava/Otto EventBus

fer*_*hur 2 java android guava event-bus otto

假设以下场景包含A,B类和一个事件总线实例(可以是Guava事件总线,由Google或Otto事件总线,由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
Run Code Online (Sandbox Code Playgroud)

现在,如果我运行它(仅用Otto测试)onSomething被调用2次.

¿事件总线是否会引用' a'直到取消注册?

更重要的是

¿如果由于某种原因我无法确定' a'将为null 的那一刻,那么事件总线将永远保持对该对象的无用引用(内存泄漏)?

Jak*_*ton 7

活动巴士总是会有很强的参考价值.你的两个问题的答案都是肯定的.

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

我强烈建议您将对象的注册绑定到除清除本地引用之外的其他内容.Android的活动和片段的生命周期是一个显而易见的选择等等都是一样的东西close,并destroy在单个对象样的方法.