android - 何时注销 LifecycleObserver

标签 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 将这个“someLifecycleObserver”对象注入(inject) Activity(以及其他地方,如 fragment )。

简单的 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;
    }

Cool everything works without adding register call inside the Activity.可是等等!没有注销。谁来注销观察者?我们这里有泄漏吗?

所以毕竟我们必须在 Activity 的 onDestroy 中添加注销调用来注销注入(inject)的对象。但是如果对象也被注入(inject)到 fragment 中,我们不想在那里注销它。仅在 Activity 中 - 这使得很难维护,因为您必须记住(如果您一开始就知道)在 Dagger 注入(inject)后以某种方式进行清理。

还有另一种解决方案,从我的角度来看,这是一种灰色地带。该对象已注册到 Lifecycle,因此从技术上讲它将获得 onDestroy 事件,并且可以将 LifecycleOwner 作为参数。所以实际上我们可以这样做:

@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy(LifecycleOwner source) {
    source.getLifecycle().removeObserver(this);
}

它有效,但我认为这不是可行的方法。您对此有何想法和/或模式。你能推荐一下你如何在不在 Activity 中使用大量样板代码的情况下解决这个问题吗?

谢谢。

最佳答案

简短回答:LifecycleObserver 会自动注销自己。

描述: LifecycleObserver 的目的是避免分别在 onCreate()onDestory() 中编写样板代码来加载和清理资源,如果我们需要像在 onDestory() 中注销它一样会破坏 LifecycleObserver 的目的。

如果您使用 observeForever 之类的东西,您需要手动注销。

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

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

关于android - 何时注销 LifecycleObserver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47919946/

相关文章:

机器人:重叠图像?

android - 在 eclipse 下调试 android 中的 native 代码失败

android 应用程序显示空白白屏而不是启动画面

android - 如何避免 Picasso 对调整大小的图像重复发出网络请求?

Android kotlin 和 Room Persistences 库未构建

Android:在没有互联网的情况下连接两个设备

Android View - onAttachedToWindow 和 onDetachedFromWindow - 它们在 Activity 生命周期中何时被调用?

android - 在两 Pane 布局中使用 SupportMapFrament 会导致重复布局错误

android - 使用 kotlin 学习 Android MVVM 架构组件

kotlin - PageKeyedDataSource loadAfter 连续调用