我正在使用架构组件处理项目,我对正确使用LifecycleObserver模式有疑问。
问题是:我什么时候应该取消注册观察者?如果没有注册取消注册会发生什么?
简单明了的用例可能如下所示:
public class MyActivity extends LifecycleActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
getLifecycle().addObserver(someLifecycleObserver);
}
@Override
protected void onDestroy() {
super.onDestroy();
...
getLifecycle().removeObserver(someLifecycleObserver);
}
}
这可能没有脑子和正确使用。但是有了更多的观察者,会有很多这样的样板代码。
好的,现在让我们添加Dagger吧。我们可以让Dagger注入这个“一些生命周期的服务器”。对象进入Activity(以及像片段一样的其他地方)。
简单的Dagger模块可能如下所示:
@Module
public class ConfigurationManagerModule {
@Provides
@ActivityScope
SomeManager provideSomeManager(final AppCompatActivity activity, final Object otherDependency) {
return new SomeManager(activity, otherDependency);
}
}
然后在Activity中我们需要注册/取消注册观察者。但是,如果我们可以摆脱注册并让Dagger这样做,那该怎么办呢。
@Provides
@ActivityScope
SomeManager provideSomeManager(final AppCompatActivity activity, final Object otherDependency) {
final SomeManager manager = new SomeManager(activity, otherDependency);
activity.getLifecycle().addObserver(manager);
return manager;
}
在没有在Activity中添加注册调用的情况下,一切正常。可是等等!没有取消注册。谁将取消注册观察员?我们这里有泄漏吗?
因此,毕竟我们必须在onDestroy of Activity中添加取消注册调用以取消注册注入的对象。但是如果对象被注入片段中,我们也不想在那里取消注册。仅在活动中 - 这使得难以维护,因为你必须记住(如果你知道它首先)在Dagger注射后以某种方式清洁。
从我的角度来看,还有另一种解决方案是灰色区域。该对象已注册到生命周期,因此它在技术上将获得onDestroy事件,并且可以将LifecycleOwner作为参数。所以实际上我们可以做到这一点:
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy(LifecycleOwner source) {
source.getLifecycle().removeObserver(this);
}
它有效,但我不认为这是要走的路。你有什么想法和/或模式。您是否可以在活动中使用大量样板代码来推荐解决此问题的方法?
谢谢。
答案 0 :(得分:2)
简答:否,LifecycleObserver
自动取消注册。
描述:
LifecycleObserver
的目的是消除编写样板代码以分别加载和清理onCreate()
和onDestory()
中的资源,如果我们需要这样做,例如在onDestory()
中取消注册它破坏LifecycleObserver
的目的。
如果您使用observeForever
类型的内容,则需要手动取消注册。
有关它的更多信息:https://github.com/googlecodelabs/android-lifecycles/issues/5
编辑:我不确定Dagger。虽然最后一种方法对我来说似乎不好,因为它破坏了可读性。