我从一个片段中调用了一个视图模型方法。在屏幕旋转后,我的视图模型被再次调用。我需要不要因为它的值而破坏我创建的视图模型。
我知道这是可能的处理它与协程作业。
你能告诉我我们是否有更好的方法做这件事吗
检视模型
private var _counterViewModelLiveData = MutableLiveData(0)
val counterViewModelLiveData
get() = _counterViewModelLiveData
private var job: Job? = null
fun startVmCounter() {
job?.cancel()
job = viewModelScope.launch {
while (true) {
delay(TimeUnit.SECONDS.toMillis(1))
_counterViewModelLiveData.value = _counterViewModelLiveData.value!! + 1
}
}
}
碎片
private fun viewModelSaveState(){
vm.startVmCounter()
vm.counterViewModelLiveData.observe(viewLifecycleOwner){
binding.txtViewmodelSaveStateCounter.text = it.toString()
}
}
此外,我知道SavedStateHandle,但我不想破坏我创建的ViewModel并再次使用SavedStateHandle获取数据。
2条答案
按热度按时间omtl5h9j1#
假设您正确地检索了ViewModel,它不应该被重新创建。从您发布的代码来看,问题可能是在重新创建 Fragment 后再次调用
viewModelSaveState
。您希望仅在第一次创建Fragment时调用startVmCounter
。要了解是否是这种情况,你可以检查你在onViewCreated
中得到的Bundle
是否为空。另一方面,你每次都调用vm.counterViewModelLiveData.observe
是正确的,因为否则你在重新创建后将得不到更新。cwxwcias2#
只需将代码从
viewModelSaveState()
放入onCreateView()
或onViewCreated()
即可。因此,观察仅在创建片段时开始,而不是在更改配置时开始。