何时注销 LifecycleObserver
When to unregister LifecycleObserver
我正在处理一个使用架构组件的项目,我对正确使用 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;
}
Cool everything works without adding register call inside the Activity.可是等等!没有注销。谁来注销观察者?我们这里有漏洞吗?
所以毕竟我们必须在Activity的onDestroy中添加注销调用来注销注入的对象。但是如果对象也被注入到片段中,我们不想在那里注销它。仅在 Activity - 这使得很难维护,因为你必须记住(如果你一开始就知道)在 Dagger 注入后以某种方式进行清理。
还有另一种解决方案,在我看来这是一种灰色地带。该对象已注册到 Lifecycle,因此从技术上讲它将获得 onDestroy 事件,并且可以将 LifecycleOwner 作为参数。所以实际上我们可以这样做:
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy(LifecycleOwner source) {
source.getLifecycle().removeObserver(this);
}
它有效,但我认为这不是可行的方法。您对此有何看法 and/or 模式。你能推荐一下你如何在你的活动中不使用大量样板代码的情况下解决这个问题的方法吗?
谢谢。
简答:否,LifecycleObserver
自动un-register他们自己。
说明:
LifecycleObserver
的目的是消除编写样板代码以分别在 onCreate()
和 onDestory()
中加载和清理资源,如果我们需要做同样的事情,比如在 onDestory()
中注销它破坏了 LifecycleObserver
.
的目的
如果您使用 observeForever
之类的东西,您需要手动注销。
更多信息:https://github.com/googlecodelabs/android-lifecycles/issues/5
编辑:我不确定 Dagger。虽然最后一种方法对我来说似乎是糟糕的代码,因为它破坏了可读性。
我正在处理一个使用架构组件的项目,我对正确使用 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;
}
Cool everything works without adding register call inside the Activity.可是等等!没有注销。谁来注销观察者?我们这里有漏洞吗?
所以毕竟我们必须在Activity的onDestroy中添加注销调用来注销注入的对象。但是如果对象也被注入到片段中,我们不想在那里注销它。仅在 Activity - 这使得很难维护,因为你必须记住(如果你一开始就知道)在 Dagger 注入后以某种方式进行清理。
还有另一种解决方案,在我看来这是一种灰色地带。该对象已注册到 Lifecycle,因此从技术上讲它将获得 onDestroy 事件,并且可以将 LifecycleOwner 作为参数。所以实际上我们可以这样做:
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy(LifecycleOwner source) {
source.getLifecycle().removeObserver(this);
}
它有效,但我认为这不是可行的方法。您对此有何看法 and/or 模式。你能推荐一下你如何在你的活动中不使用大量样板代码的情况下解决这个问题的方法吗?
谢谢。
简答:否,LifecycleObserver
自动un-register他们自己。
说明:
LifecycleObserver
的目的是消除编写样板代码以分别在 onCreate()
和 onDestory()
中加载和清理资源,如果我们需要做同样的事情,比如在 onDestory()
中注销它破坏了 LifecycleObserver
.
如果您使用 observeForever
之类的东西,您需要手动注销。
更多信息:https://github.com/googlecodelabs/android-lifecycles/issues/5
编辑:我不确定 Dagger。虽然最后一种方法对我来说似乎是糟糕的代码,因为它破坏了可读性。