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
    }
})