繁体   English   中英

Android 生命周期库:无法添加具有不同生命周期的相同观察者

[英]Android lifecycle library: Cannot add the same observer with different lifecycles

我有一个正在使用生命周期库的应用程序,但我收到了一个 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()
    }
}

我有同样的问题,这些代码行解决了它:

sharedViewModel.getFriendsList().observe(this, object: Observer<ArrayList<User>> {
    override fun onChanged(t: ArrayList<User>?) {
        CurrentUser.friendsList = t
    }
})

根据之前的响应,您需要做的就是每次订阅观察者时创建一个新Object

gpsState.observe(this, object: Observer<GpsState> {
    // ...
});

PD:我假设GpsState是您想要观察的数据类型。 在我的情况下是Long

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM