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

时间:2017-10-30 22:34:19

标签: android android-lifecycle

我有一个应用程序,我正在使用生命周期库,但是我得到的IllegalArgumentException表示"无法添加具有不同生命周期的相同观察者"我只在onCreate中添加观察者,我认为这是安全的。我的大多数观察者都是通过匿名类添加的,我认为这不是问题,因为观察者永远不会被回收。一个是使用a=input("") a=a.title() abilities=append(a) if abilities.count(a)>1 : print 'Your warning'

this

在此示例中,private GpsState gpsState; void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getLifecycle().addObserver(gpsState); gpsState.observe(this, (state) -> { // ... }); } 扩展GpsState以提供GPS的当前状态,并实现LiveData以便在达到ON_RESUME状态时刷新某些值。

知道我可能做错了吗?

3 个答案:

答案 0 :(得分:11)

在我的情况下,问题是lambda方法的观察者是空的。我只是尝试添加一些东西,问题解决了。例如:

gpsState.observe(this, (state) -> {
                Log.d(this.getClass().getSimpleName(), BaseNavigationActivity.this.toString());

});

JVM最有可能定义只使用静态引用的匿名类,对于这种情况,它会变成有点单例,所以在引用这样的类时,你将拥有相同的实例。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

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

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