【问题标题】:Guava/Otto EventBus with null references具有空引用的 Guava/Otto EventBus
【发布时间】:2013-07-07 04:49:39
【问题描述】:

假设以下场景具有 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”何时为空,那么事件总线将永远持有对该对象的无用引用(内存泄漏)?

【问题讨论】:

    标签: java android guava event-bus otto


    【解决方案1】:

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

    当您在上面将a 设置为null 时,您只是在清除本地引用。 Guava 和 Otto 都维护了一个强引用并且需要明确的注销。您将在两个事件总线中看到上述行为。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      相关资源
      最近更新 更多