簡體   English   中英

取消 viewModelScope 並在以后重新使用它

[英]Cancel viewModelScope and re-use it later on

我正在使用Coroutines來處理異步作業:

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

我想要做的是停止所有現有/正在進行的協程作業。 想法是我點擊不同的標簽。 如果getUsers()最多需要 5 秒,並且用戶從“用戶”選項卡單擊“作業”選項卡,我希望現有 API 調用停止並且未觀察到響應。

我試圖做viewModelScope.cancel() ,但這似乎不起作用。

問題是 - 如何在單擊按鈕時取消現有作業?

ViewModel類中定義一個可重用的Job ,如下所示:

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()
}

你可以像這樣通過它的CouroutineContext得到它的Job

viewModelScope.coroutineContext[Job]

要停止所有現有/正在進行的協程作業,您可以調用其cancel方法:

viewModelScope.coroutineContext[Job]?.cancel()

如果您最終需要啟動其他協程,則改為調用其cancelChildren方法:

viewModelScope.coroutineContext[Job]?.cancelChildren()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM