何时取消注册LifecycleObserver

时间:2017-12-21 07:27:58

标签: android android-lifecycle android-architecture-components

我正在使用架构组件处理项目,我对正确使用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);
}

它有效,但我不认为这是要走的路。你有什么想法和/或模式。您是否可以在活动中使用大量样板代码来推荐解决此问题的方法?

谢谢。

1 个答案:

答案 0 :(得分:2)

简答:LifecycleObserver自动取消注册。

描述: LifecycleObserver的目的是消除编写样板代码以分别加载和清理onCreate()onDestory()中的资源,如果我们需要这样做,例如在onDestory()中取消注册它破坏LifecycleObserver的目的。

如果您使用observeForever类型的内容,则需要手动取消注册。

有关它的更多信息:https://github.com/googlecodelabs/android-lifecycles/issues/5

编辑:我不确定Dagger。虽然最后一种方法对我来说似乎不好,因为它破坏了可读性。