使用 activity 上下文观察片段中的实时数据对象?
Observe live data objects in fragment using activity context?
我将导航底部与共享 ViewModel
一起使用,所有片段都在导航底部内,但是当第二次调用片段时会抛出此异常
java.lang.IllegalArgumentException: Cannot add the same observer with different lifecycles
我试图让所有观察者都附加到 activity 而不是它的片段,如下所示
1-在fragemt中声明viewModel
viewModel = activity?.run {
ViewModelProviders.of(this,viewModelFactory).get(SharedViewModel::class.java)
} ?: throw Exception("Invalid Activity")
2-Observer 实时数据对象
viewModel.msg.observe(activity!!, Observer {
Log.i(TAG,it)
})
3-移除观察者
override fun onStop() {
super.onStop()
viewModel.msg.removeObservers(activity!!)
}
这段代码对我来说工作正常,但我想知道我的代码是否正确并且可能工作?
提前致谢
为什么要将观察者添加到具有 activity 生命周期的片段中?如果您有一些逻辑需要在片段未激活时执行,请将其添加到您的 activity。因此,您需要的不是您所拥有的:
viewModel.msg.observe(this, Observer {
Log.i(TAG, it)
})
在您的情况下,每次重新打开片段时,您都会附加一个具有相同生命周期的新观察者,这似乎是一个错误。 Livedata 观察器经过专门设计,因此您无需手动编写代码来处理生命周期。
这是我们在片段中使用实时数据时常犯的错误。在片段上使用 this
/activity
可以重复。您应该使用 viewLifecycleOwner
进行片段中的实时数据观察。
viewModel.msg.observe(viewLifecycleOwner, Observer {
Log.i(TAG,it)
})
有关详细信息,请阅读本文 https://medium.com/@cs.ibrahimyilmaz/viewlifecycleowner-vs-this-a8259800367b
您不需要手动删除观察者。
我将导航底部与共享 ViewModel
一起使用,所有片段都在导航底部内,但是当第二次调用片段时会抛出此异常
java.lang.IllegalArgumentException: Cannot add the same observer with different lifecycles
我试图让所有观察者都附加到 activity 而不是它的片段,如下所示
1-在fragemt中声明viewModel
viewModel = activity?.run {
ViewModelProviders.of(this,viewModelFactory).get(SharedViewModel::class.java)
} ?: throw Exception("Invalid Activity")
2-Observer 实时数据对象
viewModel.msg.observe(activity!!, Observer {
Log.i(TAG,it)
})
3-移除观察者
override fun onStop() {
super.onStop()
viewModel.msg.removeObservers(activity!!)
}
这段代码对我来说工作正常,但我想知道我的代码是否正确并且可能工作? 提前致谢
为什么要将观察者添加到具有 activity 生命周期的片段中?如果您有一些逻辑需要在片段未激活时执行,请将其添加到您的 activity。因此,您需要的不是您所拥有的:
viewModel.msg.observe(this, Observer {
Log.i(TAG, it)
})
在您的情况下,每次重新打开片段时,您都会附加一个具有相同生命周期的新观察者,这似乎是一个错误。 Livedata 观察器经过专门设计,因此您无需手动编写代码来处理生命周期。
这是我们在片段中使用实时数据时常犯的错误。在片段上使用 this
/activity
可以重复。您应该使用 viewLifecycleOwner
进行片段中的实时数据观察。
viewModel.msg.observe(viewLifecycleOwner, Observer {
Log.i(TAG,it)
})
有关详细信息,请阅读本文 https://medium.com/@cs.ibrahimyilmaz/viewlifecycleowner-vs-this-a8259800367b
您不需要手动删除观察者。