android-fragments 视图-模型协程多执行

zour9fqk  于 2022-11-14  发布在  Android
关注(0)|答案(2)|浏览(168)

我从一个片段中调用了一个视图模型方法。在屏幕旋转后,我的视图模型被再次调用。我需要不要因为它的值而破坏我创建的视图模型。
我知道这是可能的处理它与协程作业。
你能告诉我我们是否有更好的方法做这件事吗
检视模型

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获取数据。

omtl5h9j

omtl5h9j1#

假设您正确地检索了ViewModel,它不应该被重新创建。从您发布的代码来看,问题可能是在重新创建 Fragment 后再次调用viewModelSaveState。您希望仅在第一次创建Fragment时调用startVmCounter。要了解是否是这种情况,你可以检查你在onViewCreated中得到的Bundle是否为空。另一方面,你每次都调用vm.counterViewModelLiveData.observe是正确的,因为否则你在重新创建后将得不到更新。

cwxwcias

cwxwcias2#

只需将代码从viewModelSaveState()放入onCreateView()onViewCreated()即可。
因此,观察仅在创建片段时开始,而不是在更改配置时开始。

相关问题