我正在构建一个实现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);
}
}
或者,我可以永远观察吗?
答案 0 :(得分:10)
TL; DR:不。
根据此link here,用户在android-lifecycles
Github回购中询问了您的问题。 Google开发人员对此问题的回答是:
是的,这是新生命周期感知组件的重点,没有 需要取消订阅/删除观察员。
答案 1 :(得分:1)
TL; DR:你最好在完成后明确删除观察者,或者使用自动处理它的东西,例如LiveData
。
Lifecycle
是abstract
类。所以,从技术上讲,你不知道实现是什么以及游戏规则是什么。
具体Lifecycle
是LifecycleRegistry
。它强烈提到了观察者。所以现在你指望LifecycleRegistry
及时垃圾收集,例如当活动被销毁时。对于FragmentActivity
,似乎就是这种情况。所以在实践中,对于所有这些东西的现在版本,你可以在不注销观察者的情况下离开并且几乎没有任何不良影响。
但那不是Lifecycle
合同的一部分。可以说,Lifecycle
(或使用LifecycleRegistry
)的任何体面的实施应该干净地处理你未能注销的情况......但我不会冒风险它
答案 2 :(得分:0)
我在管理音频的单例对象中使用LifecycleRegistry。 添加LeakCanary后,由于此问题,它检测到内存泄漏。
但是,调用removeObserver
之后,内存泄漏再也不会出现。
因此,在使用LiveData + LifecycleRegistry时,无需注销即可。但是,如果它是使用LifecycleRegistry的自定义组件,我的经验表明,必须调用removeObserver以避免内存泄漏。