是否必须将自己从 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 类。因此,从技术上讲,您不知道实现是什么以及游戏规则是什么。

具体的LifecycleLifecycleRegistry。它对观察者有很强的参考作用。所以现在你指望LifecycleRegistry 被及时的垃圾收集,例如当活动被销毁时。对于FragmentActivity,情况似乎如此。所以在实践中,对于所有这些东西的当前版本,你可以在不取消注册观察者的情况下逃脱,并且几乎不会受到任何不良影响(如果有的话)。

但这不是Lifecycle 合同的一部分。可以说,Lifecycle(或使用 LifecycleRegistry 的东西)的任何体面实现应该干净地处理您未能取消注册的情况......但我不会冒险。

【讨论】:

如果您要为明显具有与 Activity 不同(更短)的生命周期的组件注册观察者,您应该适当地取消注册。这正变得比人们意识到的更为普遍,尤其是在单一活动应用的世界中。【参考方案3】:

我在管理音频声音的单例对象中使用 LifecycleRegistry。 添加 LeakCanary 后,由于此问题,它检测到内存泄漏。

但是,调用removeObserver,内存泄漏再也没有出现过。

因此,使用 LiveData + LifecycleRegistry 时,您可能不需要取消注册。但如果是使用 LifecycleRegistry 的自定义组件,我的经验表明,调用 removeObserver 是必须的,以避免内存泄漏。

【讨论】:

以上是关于是否必须将自己从 Android 生命周期中移除为观察者?的主要内容,如果未能解决你的问题,请参考以下文章

JavaWeb之Servlet的生命周期

Activity生命周期

Flutter之 State 生命周期

Spring Bean 生命周期

小程序组件生命周期总结

flutter生命周期