9

我在我的 Android 应用程序中使用EventBus 。Eventbus.getDefault().register(this)在 my中做 a 是个好主意Application.onCreate()吗?我没有任何 UI 更新要进行。我正在尝试这样做以确保即使应用程序进入后台,我也能收到订阅数据。可能还有其他方法可以实现我想要的,但我很好奇这种方法是否有问题。

我的疑问是:

  1. 这会导致某种内存泄漏吗?Eventbus是在引用Application对象,Application对象也是依赖Eventbus。这看起来是循环的。

  2. 什么时候注销?不保证调用 Application.onTerminate()。如果 #1 不是问题,我想可以忽略 Application 类中的取消订阅。

4

2 回答 2

9

这会导致某种内存泄漏吗?Eventbus是在引用Application对象,Application对象也是依赖Eventbus。这看起来是循环的。

直接从 Application 类订阅事件是完全可以的。操作系统将清理应用程序,而 EventBus 是其中的一部分。没问题。

什么时候注销?不保证调用 Application.onTerminate()。如果 #1 不是问题,我想可以忽略 Application 类中的取消订阅。

是的,为了完整起见,我也会取消订阅 onTerminate。但是您在 Android 设备上是对的,如果清理了应用程序,那么无论如何一切都会消失,因此无需“清理”。

于 2016-02-26T17:07:41.970 回答
0

当应用程序物理停止时,您的应用程序类将被终止。

意思是:

  1. 当操作系统决定物理停止应用程序(这可能会发生几天)或有外部干预(即用户停止它或像 Clean Master 这样的实用程序应用程序)时,应用程序将完全停止并销毁。
  2. 任何静态引用也将从内存中删除(即您的 EventBus 单例)。

(2)在您正确注销侦听器时才有效,即在停止时注销活动/片段或在View.onDetachedFromWindow()等时注销视图等。

只要在您的事件回调方法中您不尝试在单独的线程中运行某些东西或更新不存在的活动/视图/片段,您应该没问题。

于 2015-11-20T23:11:10.203 回答