gpt4 book ai didi

android - 何时注销 LifecycleObserver

转载 作者:搜寻专家 更新时间:2023-11-01 09:29:58 27 4
gpt4 key购买 nike

我正在处理一个使用架构组件的项目,我对正确使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com