首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >视图-模型协同多执行

视图-模型协同多执行
EN

Stack Overflow用户
提问于 2022-08-21 17:36:08
回答 2查看 46关注 0票数 0

我从片段中调用视图模型方法。屏幕旋转后,我的视图模型再次被调用。我不需要破坏我创建的视图模型,因为它的价值。

我知道可以用Coroutines的工作来处理这件事。

你能告诉我我们是否有更好的方法做这件事吗?

ViewModel

代码语言:javascript
复制
    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
        }
    }
}

片段

代码语言:javascript
复制
    private fun viewModelSaveState(){
    vm.startVmCounter()
    vm.counterViewModelLiveData.observe(viewLifecycleOwner){
        binding.txtViewmodelSaveStateCounter.text = it.toString()
    }
}

另外,我知道SavedStateHandle,但我不想破坏我创建的ViewModel,并再次使用SavedStateHandle获取数据。

EN

回答 2

Stack Overflow用户

发布于 2022-08-21 17:46:20

假设您正在正确检索ViewModel,则不应该重新创建它。从您发布的代码中,问题可能是在重新创建片段之后再次调用viewModelSaveState。您希望只在第一次创建片段时调用startVmCounter。要知道是否是这种情况,您可以检查在onViewCreated中获得的onViewCreated是否为null。另一方面,您每次调用vm.counterViewModelLiveData.observe都是正确的,因为否则您将不会在娱乐之后得到更新。

票数 2
EN

Stack Overflow用户

发布于 2022-08-21 17:43:00

只需将代码从viewModelSaveState()放到onCreateView()onViewCreated()中即可。

因此,只有在创建片段时才会开始观察,而不是当配置发生更改时。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73436810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档