我正在使用Coroutines
处理异步作业:
viewModelScope.launch {
val userResponse = getUsers() //suspendable function
}
我想做的是停止所有现有/进行中的协程工作。想法是我单击不同的选项卡。如果getUsers()
最多需要5秒钟,并且用户从“用户”选项卡转到“作业”选项卡单击,我希望停止现有的API调用并且不观察响应。
我尝试做viewModelScope.cancel()
,但这似乎不起作用。
问题是-如何在单击按钮时取消现有作业?
答案 0 :(得分:1)
在Job
类中定义如下的可重用ViewModel
:
private var job = Job()
get() {
if (field.isCancelled) field = Job()
return field
}
将其作为父Job
传递给所有启动协程生成器:
viewModelScope.launch(job) {
val userResponse = getUsers()
}
viewModelScope.launch(job) {
// some other work
}
...
在按钮上单击,只需取消父作业:
fun cancelAll() {
job.cancel()
}
答案 1 :(得分:0)
您可以像这样通过其Job
获得其CouroutineContext
:
viewModelScope.coroutineContext[Job]
要停止所有现有/正在进行的协同程序作业,可以调用其cancel
方法:
viewModelScope.coroutineContext[Job]?.cancel()
如果最终需要启动其他协程,请改为调用其cancelChildren
方法:
viewModelScope.coroutineContext[Job]?.cancelChildren()