我正在使用架构组件开发项目,关于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将“someLifecycleObserver”对象注入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内添加register调用就可以使所有内容正常运作。但是等等!没有反注册。谁来反注册观察者?我们会出现泄漏问题吗?
所以,毕竟我们还是要在Activity的onDestroy中添加反注册调用,以反注册注入的对象。但是如果该对象也被注入到Fragment中,我们不想在那里反注册它。只在Activity中反注册 - 这使得维护变得困难,因为你必须记住(如果你一开始知道)如何在Dagger注入之后进行清理。
还有另一种解决方案,在我看来有些灰色地带。对象已经注册到了生命周期中,因此在实际上可以获得onDestroy事件,并且可以将LifecycleOwner作为参数获取。因此,我们可以这样做:
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy(LifecycleOwner source) {
source.getLifecycle().removeObserver(this);
}
它能够正常工作,但我认为这不是最好的方法。你有什么想法或模式来解决这个问题吗?你可以推荐一种方法,在不使用大量样板代码的情况下解决这个问题吗?
谢谢。