Android:通过服务在 ViewModel 中设置 LiveData
Android: Set LiveData in ViewModel from a Service
我设置应用程序的方式是,服务 将在后台获取一些信息,这些信息需要由 实时获取Fragment,然后显示到视图中。为此,我将数据放入 ViewModel 并让我的 Fragment 观察 ViewModel 中的 LiveData。
问题是,我在 setting/changing 来自服务的 ViewModel class 中的 LiveData 遇到了问题。 看来 ViewModel 应该是在活动和片段之间使用,我似乎无法在我的服务中获取 ViewModel 以更改我的片段需要观察的值。有没有办法实现这个?
您可能希望使用具有在您的服务中修改的自己的 MutableLiveData 字段的存储库。然后,您的 ViewModel 将有一个指向 Repository 字段的 MutableLiveData 字段,并且您的 Fragment 可以观察该字段。
片段:
...
viewModel.myData.observe(viewLifecycleOwner) { myData ->
// handle new data observed
}
...
视图模型:
// Need to clear repo reference in [onCleared] to avoid resource leaks
private var _myData: MutableLiveData<MyData>? = myRepo.myData
val myData: MutableLiveData<MyData> = _myData
...
override fun onCleared() {
super.onCleared()
_myData = null
}
存储库:
val myData = MutableLiveData<MyData>() // or whatever source (Room, etc.)
服务:
...
Repository.getInstance().myData.postValue(/* some new info */)
...
我设置应用程序的方式是,服务 将在后台获取一些信息,这些信息需要由 实时获取Fragment,然后显示到视图中。为此,我将数据放入 ViewModel 并让我的 Fragment 观察 ViewModel 中的 LiveData。
问题是,我在 setting/changing 来自服务的 ViewModel class 中的 LiveData 遇到了问题。 看来 ViewModel 应该是在活动和片段之间使用,我似乎无法在我的服务中获取 ViewModel 以更改我的片段需要观察的值。有没有办法实现这个?
您可能希望使用具有在您的服务中修改的自己的 MutableLiveData 字段的存储库。然后,您的 ViewModel 将有一个指向 Repository 字段的 MutableLiveData 字段,并且您的 Fragment 可以观察该字段。
片段:
...
viewModel.myData.observe(viewLifecycleOwner) { myData ->
// handle new data observed
}
...
视图模型:
// Need to clear repo reference in [onCleared] to avoid resource leaks
private var _myData: MutableLiveData<MyData>? = myRepo.myData
val myData: MutableLiveData<MyData> = _myData
...
override fun onCleared() {
super.onCleared()
_myData = null
}
存储库:
val myData = MutableLiveData<MyData>() // or whatever source (Room, etc.)
服务:
...
Repository.getInstance().myData.postValue(/* some new info */)
...