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

时间:2017-12-05 15:04:50

标签: android android-lifecycle activity-lifecycle

我正在构建一个实现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);
    }
}

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

3 个答案:

答案 0 :(得分:10)

TL; DR:不。

根据此link here,用户在android-lifecycles Github回购中询问了您的问题。 Google开发人员对此问题的回答是:

  

是的,这是新生命周期感知组件的重点,没有   需要取消订阅/删除观察员。

答案 1 :(得分:1)

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

Lifecycleabstract类。所以,从技术上讲,你不知道实现是什么以及游戏规则是什么。

具体LifecycleLifecycleRegistry。它强烈提到了观察者。所以现在你指望LifecycleRegistry及时垃圾收集,例如当活动被销毁时。对于FragmentActivity,似乎就是这种情况。所以在实践中,对于所有这些东西的现在版本,你可以在不注销观察者的情况下离开并且几乎没有任何不良影响。

但那不是Lifecycle合同的一部分。可以说,Lifecycle(或使用LifecycleRegistry的任何体面的实施应该干净地处理你未能注销的情况......但我不会冒风险它

答案 2 :(得分:0)

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

但是,调用removeObserver之后,内存泄漏再也不会出现。

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