我有一个正在研究的应用程序,它正在使用生命周期库,但是我得到一个IllegalArgumentException,上面写着“不能添加具有不同生命周期的相同观察者”我只在onCreate中添加观察者,我认为这是安全的。我的大多数观察者都是通过匿名类添加的,我认为这不是问题所在,因为观察者永远不会被回收。一个是使用this
:
private GpsState gpsState;
void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getLifecycle().addObserver(gpsState);
gpsState.observe(this, (state) -> {
// ...
});
}
在这个例子中,GpsState
扩展LiveData
以提供GPS的当前状态并实现LifecycleObserver
以便能够在达到ON_RESUME状态时刷新某些值。
知道我可能做错了什么吗?
在我的情况下,问题是lambda方法的观察者是空的。我只是尝试添加一些东西,问题解决了。例如:
gpsState.observe(this, (state) -> {
Log.d(this.getClass().getSimpleName(), BaseNavigationActivity.this.toString());
});
很可能JVM定义了仅使用静态引用的匿名类,对于这种情况,它变得有点单例,因此在引用此类时,您将拥有相同的实例。
正如thehebrewhammer在评论中所说,由于Kotlin SAM-Lambda优化,我遇到了同样的问题。
viewModel.myLiveData.observe(this, Observer {
NavigationBackEvent().post()
})
此SAM-Lambda不访问该类的任何内容,并将编译为单例以进行优化。 我将其更改为类初始化,以便在每次运行时强制执行新实例:
viewModel.myLiveData.observe(this, MyObserver())
和
class MyObserver : Observer<MyType?> {
override fun onChanged(it: MyType?) {
NavigationBackEvent().post()
}
}