2

假设以下场景具有 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

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

¿ 事件总线是否会保留对“ a”的引用,直到调用取消注册?

更重要的是

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

4

1 回答 1

7

事件总线将始终保持强引用。你的两个问题的答案都是肯定的。

当您设置anull上述时,您仅清除本地参考。Guava 和 Otto 都维护了一个强引用并且需要明确的取消注册。您将在两个事件总线中看到上述行为。

我强烈建议您将对象的注册与清除本地引用以外的其他事情联系起来。Android Activity 和 Fragment 生命周期是一个显而易见的选择,单个对象上的类似close方法destroy也是如此。

于 2013-07-07T05:04:05.477 回答