在onDestroy中取消注册侦听器 - 它们有什么危害/可以泄漏?

时间:2014-04-07 22:41:37

标签: android otto

我试图了解在onDestroy取消注册监听器之前是否有任何潜在的危害。我特别指的是取消订阅eventbus(otto),但相信答案适用于大多数listener pattern实施(SharedPreferenceListenerLocationListenerstatic引用等)

我已经看到several other answers这个问题引用了“onDestroy不能保证被调用”这个短语。完整的onDestroy documentation文字实际上是:

  

注意:不要指望将此方法称为保存数据的地方!例如,如果某个活动正在编辑内容提供程序中的数据,那么这些编辑应该在onPause()或onSaveInstanceState(Bundle)中提交,而不是在此处。通常实现此方法是为了释放与活动相关联的线程之类的资源,以便在其应用程序的其余部分仍在运行时,被破坏的活动不会留下这些东西。在某些情况下,系统会在不调用此方法(或其他任何方法)的情况下简单地终止活动的托管过程,因此不应该使用它来执行在过程消失后仍然存在的事情。

我理解这意味着onDestroy不应该用于保存数据,因为在应用程序进程被终止之前可能无法调用它(如生命周期图所示)

简单地说,由于没有调用onDestroy,是否存在注册为侦听器的Activity可能会泄露的情况?

1 个答案:

答案 0 :(得分:5)

  

是否存在由于未调用onDestroy而导致注册为侦听器的Activity泄露的情况?

不是我能想到的。但是,这与:

不一样
  

在onDestroy中取消注册侦听器 - 有什么危害?

在早期生命周期方法中取消注册侦听器的原因(例如,onPause() / onStop())是因为当活动不在前台时,活动不需要这些事件。

您的应用程序已经必须处理活动被销毁的情况,例如用户按下BACK按钮,然后用户稍后返回到应用程序中的相同位置。您将需要创建活动的新实例,并且该活动实例将需要从某些数据源获取它需要显示的任何内容。因此,如果 代码有效,你可以使用相同的"得到它需要的任何东西"当现有活动实例返回到前台时刷新现有活动实例的逻辑。 IOW,根据您获取数据的位置,将返回的活动与新创建的活动区别开来。