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