取消 viewModelScope 并稍后重新使用它

Pet*_*der 1 android kotlin kotlin-coroutines

我用来Coroutines处理异步作业:

viewModelScope.launch {
    val userResponse = getUsers() //suspendable function 
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

ami*_*phy 8

Job在类中定义一个可重用的,如下所示ViewModel

private var job = Job()
    get() {
        if (field.isCancelled) field = Job()
        return field
    }
Run Code Online (Sandbox Code Playgroud)

将其作为父级传递给所有启动协程构建器Job

viewModelScope.launch(job) {
    val userResponse = getUsers()
}

viewModelScope.launch(job) {
    // some other work
}

...
Run Code Online (Sandbox Code Playgroud)

单击按钮时,只需取消父作业:

fun cancelAll() {
    job.cancel()
}
Run Code Online (Sandbox Code Playgroud)