是否必须从 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。所以,从技术上讲,你不知道实现是什么,游戏规则是什么。
具体的Lifecycle
是LifecycleRegistry
。它对观察者有很强的参考意义。所以现在您指望 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是必须的,以避免内存泄漏。
我正在构建一个实现 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。所以,从技术上讲,你不知道实现是什么,游戏规则是什么。
具体的Lifecycle
是LifecycleRegistry
。它对观察者有很强的参考意义。所以现在您指望 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是必须的,以避免内存泄漏。