我从片段中调用视图模型方法。屏幕旋转后,我的视图模型再次被调用。我不需要破坏我创建的视图模型,因为它的价值。
我知道可以用Coroutines的工作来处理这件事。
你能告诉我我们是否有更好的方法做这件事吗?
ViewModel
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获取数据。
发布于 2022-08-21 17:46:20
假设您正在正确检索ViewModel,则不应该重新创建它。从您发布的代码中,问题可能是在重新创建片段之后再次调用viewModelSaveState。您希望只在第一次创建片段时调用startVmCounter。要知道是否是这种情况,您可以检查在onViewCreated中获得的onViewCreated是否为null。另一方面,您每次调用vm.counterViewModelLiveData.observe都是正确的,因为否则您将不会在娱乐之后得到更新。
发布于 2022-08-21 17:43:00
只需将代码从viewModelSaveState()放到onCreateView()或onViewCreated()中即可。
因此,只有在创建片段时才会开始观察,而不是当配置发生更改时。
https://stackoverflow.com/questions/73436810
复制相似问题