是否必须从 Android 生命周期中将自己作为观察者移除?

Is it mandatory to remove yourself as an observer from Android Lifecycle?

我正在构建一个实现 LifecycleObserver 接口的 Android Java class。

这是构造函数:

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);
    }
}

或者,我可以一直观察吗?

TL;DR:您最好在完成观察器后显式删除它,或者使用自动处理它的东西,例如 LiveData.

Lifecycle 是一个 abstract class。所以,从技术上讲,你不知道实现是什么,游戏规则是什么。

具体的LifecycleLifecycleRegistry。它对观察者有很强的参考意义。所以现在您指望 LifecycleRegistry 被及时回收,例如当 activity 被销毁时。对于 FragmentActivity,情况似乎是这样。所以在实践中,对于所有这些东西的最新版本,你可以在不注销观察者的情况下逃脱,并且几乎不会受到任何不良影响。

但这不是 Lifecycle 合同的一部分。可以说,Lifecycle(或使用 LifecycleRegistry 的东西) 的任何体面的实现都应该 干净地处理你无法注销的情况......但我不会冒险吧。

TL;DR: 没有。

根据此 link here,用户在 android-lifecycles Github 存储库中提出了您的问题。 Google 开发者对这个问题的回答是:

Yes, that's the whole point of the new lifecycle-aware components, no need to unsubscribe/remove observers.

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

然而,调用removeObserver,内存泄漏再也没有出现。

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