【问题标题】:Is it mandatory to remove yourself as an observer from Android Lifecycle?是否必须将自己从 Android 生命周期中移除为观察者?
【发布时间】: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);
    }
}

或者,我可以永远观察吗?

【问题讨论】:

    标签: android android-lifecycle activity-lifecycle


    【解决方案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 是必须的,以避免内存泄漏。

      【讨论】:

        猜你喜欢
        • 2019-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多