何时注销 LifecycleObserver?

3

我正在使用架构组件开发项目,关于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);
}

它能够正常工作,但我认为这不是最好的方法。你有什么想法或模式来解决这个问题吗?你可以推荐一种方法,在不使用大量样板代码的情况下解决这个问题吗?

谢谢。

1个回答

5
简短回答: 不需要, LifecycleObserver 会自动取消注册。
描述: LifecycleObserver 的目的是消除在 onCreate()onDestory() 中加载和清理资源的样板代码,如果我们需要在 onDestory() 中取消注册,则摧毁了 LifecycleObserver 的目的。
如果您使用 observeForever 等方式,则需要手动取消注册。
更多信息: https://github.com/googlecodelabs/android-lifecycles/issues/5 编辑: 我不确定 Dagger。尽管最后一种方法对我来说是糟糕的代码,因为它破坏了可读性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接