处理Cannot add the same observer with different lifecycles错误

5,843 阅读1分钟

开发中造成这个问题的原因我遇到两种,一种是Lambda表达式中未使用非静态方法或引用,例如:

viewModel.errorMessageResult.observe(this, Observer {
      	//静态方法
        CustomToast.showToast(it, MainApplication.mContext)
})

第二种是Lambda表达式闭包内为空,例如

viewModel.errorMessageResult.observe(this, Observer {
      	
})

lambda表达式如果未持有外部类对象,那么kotlin编译器会进行单例优化,导致重复观察时使用了同一个observer对象所以造成崩溃

崩溃的原因直接看源码

两种解决办法:

1、不使用Lambda表达式,例如

viewModel.errorMessageResult.observe(this, object : Observer<String> {
        override fun onChanged(t: String?) {
            //处理Cannot add the same observer with different lifecycles错误
            CustomToast.showToast(t, MainApplication.mContext)
        }
})

2、Lambda表达式闭包内引用非静态方法或引用,例如

viewModel.errorMessageResult.observe(this, Observer {
	//非静态方法
	searchRecordList.clear()
      	//静态方法
        CustomToast.showToast(it, MainApplication.mContext)
})