[英]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.