gpt4 book ai didi

java - 带有空引用的 Guava/Otto EventBus

转载 作者:太空狗 更新时间:2023-10-29 16:05:11 24 4
gpt4 key购买 nike

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

最佳答案

事件总线将始终具有很强的引用意义。你的两个问题的答案都是肯定的。

当您将上面的 a 设置为 null 时,您只是清除了本地引用。 Guava 和 Otto 都保持着强引用并要求显式注销。您将在两个事件总线中看到上述行为。

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

关于java - 带有空引用的 Guava/Otto EventBus,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17509382/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com