取消viewModelScope,稍后再使用

时间:2020-09-07 10:47:19

标签: android kotlin-coroutines

我正在使用Coroutines处理异步作业:

viewModelScope.launch {
    val userResponse = getUsers() //suspendable function 
}

我想做的是停止所有现有/进行中的协程工作。想法是我单击不同的选项卡。如果getUsers()最多需要5秒钟,并且用户从“用户”选项卡转到“作业”选项卡单击,我希望停止现有的API调用并且不观察响应。

我尝试做viewModelScope.cancel(),但这似乎不起作用。

问题是-如何在单击按钮时取消现有作业?

2 个答案:

答案 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()