繁体   English   中英

使用父母的 ViewModel scope 运行协程

[英]run coroutine with parent's ViewModel scope

我刚开始使用协程,我不太确定我是否以正确的方式使用它。 我的 android 应用程序只有 1 个带有多个片段和对话框片段的活动。 我创建了一个功能,询问用户他/她是否接受做某事。 该应用程序显示一个带有是/否按钮的DialogFragment 如果用户单击Yes ,它将关闭对话框并执行该工作。

我想在活动的 viewModelScope 中开始繁重的工作,因此当用户导航到其他片段时,它将继续在后台事件中执行。

父母的 ViewModel:

class ActivityViewModel: ViewModel(){
    fun doJob(){
        viewModelScope.launch{
            //Do the heavy job
        }
    }
}

对话框片段视图模型:

class DialogViewModel: ViewModel(){
    var activityVM: ActivityViewModel
    fun onYesClicked(){
        activityVM.doJob()
    }
}

我猜这项工作是在 DialogFragment 的 ViewModel scope 而不是 Activity 的 ViewModel scope 下执行的。 这会导致一个问题,即当作业运行速度比预期慢时,它会因为对话框被关闭而被取消。

我不确定这是否是常见做法,因为我找不到任何类似的讨论。 请帮助指出我在此代码上哪里错了,或者有适合这种情况的最佳实践。

我最终在活动视图模型上使用了自定义协程 scope。 通过这样做,我在活动关闭事件而不是对话框片段关闭时手动取消协程。

class ActivityViewModel: ViewModel(){
    private val mainActivityScope = CoroutineScope(Dispatchers.IO + SupervisorJob())
    fun doJob(){
        mainActivityScope.launch{
            //Do the heavy job
        }
    }

    override fun onCleared() {
        super.onCleared()
        mainActivityScope.cancel()
    }

}

class DialogViewModel: ViewModel(){
    var activityVM: ActivityViewModel
    fun onYesClicked(){
        activityVM.doJob()
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM