Android 生命周期库:无法添加具有不同生命周期的同一个观察者
Android lifecycle library: Cannot add the same observer with different lifecycles
我有一个正在使用生命周期库的应用程序,但我收到一个 IllegalArgumentException,上面写着 "Cannot add the same observer with different lifecycles" 我只在我认为安全的 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 定义了仅使用静态引用的匿名 classes,对于这种情况,它变成了单例,因此您在引用此类 class 时将始终拥有相同的实例。
正如 在评论中所说,由于 Kotlin SAM-Lambda 优化,我遇到了同样的问题。
viewModel.myLiveData.observe(this, Observer {
NavigationBackEvent().post()
})
此 SAM-Lambda 不访问 class 的任何内容,将被编译为单例以进行优化。
我将其更改为 class 初始化以在每个 运行:
处强制新实例
viewModel.myLiveData.observe(this, MyObserver())
和
class MyObserver : Observer<MyType?> {
override fun onChanged(it: MyType?) {
NavigationBackEvent().post()
}
}
根据之前的回复,您需要做的就是在每次订阅观察员时创建一个新的Object
。
gpsState.observe(this, object: Observer<GpsState> {
// ...
});
PD:我假设 GpsState
是您想要观察的数据类型。在我的例子中是 Long
我遇到了同样的问题,这些代码行解决了它:
sharedViewModel.getFriendsList().observe(this, object: Observer<ArrayList<User>> {
override fun onChanged(t: ArrayList<User>?) {
CurrentUser.friendsList = t
}
})
我有一个正在使用生命周期库的应用程序,但我收到一个 IllegalArgumentException,上面写着 "Cannot add the same observer with different lifecycles" 我只在我认为安全的 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 定义了仅使用静态引用的匿名 classes,对于这种情况,它变成了单例,因此您在引用此类 class 时将始终拥有相同的实例。
正如
viewModel.myLiveData.observe(this, Observer {
NavigationBackEvent().post()
})
此 SAM-Lambda 不访问 class 的任何内容,将被编译为单例以进行优化。
我将其更改为 class 初始化以在每个 运行:
viewModel.myLiveData.observe(this, MyObserver())
和
class MyObserver : Observer<MyType?> {
override fun onChanged(it: MyType?) {
NavigationBackEvent().post()
}
}
根据之前的回复,您需要做的就是在每次订阅观察员时创建一个新的Object
。
gpsState.observe(this, object: Observer<GpsState> {
// ...
});
PD:我假设 GpsState
是您想要观察的数据类型。在我的例子中是 Long
我遇到了同样的问题,这些代码行解决了它:
sharedViewModel.getFriendsList().observe(this, object: Observer<ArrayList<User>> {
override fun onChanged(t: ArrayList<User>?) {
CurrentUser.friendsList = t
}
})