是否必须将自己从 Android 生命周期中移除为观察者?
Posted
技术标签:
【中文标题】是否必须将自己从 Android 生命周期中移除为观察者?【英文标题】:Is it mandatory to remove yourself as an observer from Android Lifecycle? 【发布时间】:2018-05-19 07:08:41 【问题描述】:我正在构建一个实现LifecycleObserver
接口的android Java 类。
这是构造函数:
public MyObserver(AppCompatActivity activity)
this.mActivity = new WeakReference<AppCompatActivity>(activity);
activity.getLifecycle().addObserver(this);
是否有必要打电话给removeObserver
,使用类似:
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void destroyListener()
if (this.mActivity.get() != null)
this.mActivity.get().getLifecycle().removeObserver(this);
或者,我可以永远观察吗?
【问题讨论】:
【参考方案1】:TL;DR:不。
根据这个link here,一位用户在android-lifecycles
Github repo 上提出了您的问题。 Google 开发人员对这个问题的回答是:
是的,这就是新的生命周期感知组件的重点,不 需要取消订阅/删除观察者。
【讨论】:
【参考方案2】:TL;DR:你最好在完成后显式删除观察者,或者使用自动处理这个问题的东西,例如LiveData
。
Lifecycle
是一个 abstract
类。因此,从技术上讲,您不知道实现是什么以及游戏规则是什么。
具体的Lifecycle
是LifecycleRegistry
。它对观察者有很强的参考作用。所以现在你指望LifecycleRegistry
被及时的垃圾收集,例如当活动被销毁时。对于FragmentActivity
,情况似乎如此。所以在实践中,对于所有这些东西的当前版本,你可以在不取消注册观察者的情况下逃脱,并且几乎不会受到任何不良影响(如果有的话)。
但这不是Lifecycle
合同的一部分。可以说,Lifecycle
(或使用 LifecycleRegistry
的东西)的任何体面实现应该干净地处理您未能取消注册的情况......但我不会冒险。
【讨论】:
如果您要为明显具有与 Activity 不同(更短)的生命周期的组件注册观察者,您应该适当地取消注册。这正变得比人们意识到的更为普遍,尤其是在单一活动应用的世界中。【参考方案3】:我在管理音频声音的单例对象中使用 LifecycleRegistry。 添加 LeakCanary 后,由于此问题,它检测到内存泄漏。
但是,调用removeObserver
,内存泄漏再也没有出现过。
因此,使用 LiveData + LifecycleRegistry 时,您可能不需要取消注册。但如果是使用 LifecycleRegistry 的自定义组件,我的经验表明,调用 removeObserver 是必须的,以避免内存泄漏。
【讨论】:
以上是关于是否必须将自己从 Android 生命周期中移除为观察者?的主要内容,如果未能解决你的问题,请参考以下文章