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

esi*_*ver 13 android activity-lifecycle android-lifecycle

我正在构建一个实现该LifecycleObserver接口的Android Java类.

这是构造函数:

public MyObserver(AppCompatActivity activity) {
    this.mActivity = new WeakReference<AppCompatActivity>(activity);
    activity.getLifecycle().addObserver(this);
}
Run Code Online (Sandbox Code Playgroud)

是否有必要使用以下内容进行呼叫removeObserver:

@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void destroyListener() {
    if (this.mActivity.get() != null) {
        this.mActivity.get().getLifecycle().removeObserver(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Tar*_*ury 14

TL; DR:不。

根据此处的链接,用户在android-lifecyclesGithub存储库上询问您的问题。Google开发人员对此问题的回答是:

是的,这就是新的生命周期感知组件的重点,无需取消订阅/删除观察者。


Com*_*are 8

TL;DR:你最好在完成后明确删除观察者,或者使用自动处理这个的东西,比如LiveData.

Lifecycle是一个abstract类。因此,从技术上讲,您不知道实现是什么以及游戏规则是什么。

一个具体Lifecycle是LifecycleRegistry。它对观察者有很强的引用。因此,现在您指望LifecycleRegistry及时进行垃圾收集,例如活动被销毁时。对于FragmentActivity,情况似乎如此。所以在实践中,对于所有这些东西的当前版本,你可以在不注销观察者的情况下逃脱,并且几乎不会受到不良影响,如果有的话。

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