【发布时间】:2019-09-08 22:24:37
【问题描述】:
我正在使用导航底部和共享ViewModel 与导航底部内的所有片段,但它在第二次调用片段时抛出此异常
java.lang.IllegalArgumentException: Cannot add the same observer with different lifecycles
我试图让所有观察者都附加到活动而不是它的片段,如下所示
1-在fragemt中声明viewModel
viewModel = activity?.run {
ViewModelProviders.of(this,viewModelFactory).get(SharedViewModel::class.java)
} ?: throw Exception("Invalid Activity")
2-Observer livedata 对象
viewModel.msg.observe(activity!!, Observer {
Log.i(TAG,it)
})
3- 移除观察者
override fun onStop() {
super.onStop()
viewModel.msg.removeObservers(activity!!)
}
这段代码对我来说工作正常,但我想知道我的代码是否正确并且可能工作? 提前致谢
【问题讨论】:
-
您应该使用片段生命周期观察 livedata,您仍然拥有共享的
ViewModel对象,因为您已经从活动中获取它,但您不需要手动删除观察者。如果您的片段正在分离/重新连接,您可以考虑改用viewLifecycleOwner。 -
尽量不要在 onStop() 中移除观察者。
标签: android kotlin android-livedata android-viewmodel