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

Kyl*_*vey 5 android otto

我试图了解是否有任何潜在的伤害,等待onDestroy取消注册听众.我特别提到从eventbus(奥托)退订,但相信答案适用于大多数listener pattern的实现(SharedPreferenceListener,LocationListener,static参考文献等).

我已经看到 这个问题的其他几个答案引用了"onDestroy不能保证被调用"的短语.完整的onDestroy 文档文本实际上是:

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

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

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

Com*_*are 5

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

不是我能想到的.但是,这与以下内容不同:

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

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

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

  • @KyleIvey:这在一定程度上取决于 `onDatasetChanged()` 的实现。反对意见类似于“SensorEventListener”,其中不在前台的活动可能不需要每秒调用数十次,并且不会为用户增加价值的新传感器数据。“伤害”因场景而异。在某些情况下,危害可能很大,而在其他情况下,危害可能较小。默认的开发人员行为应该是在后台避免这些事件,然后如果您确信该值大大超过了危害,则选择加入它们。 (2认同)