1.協(xié)程取消
一個用戶關(guān)閉了一個啟動了協(xié)程的界面吟孙,那么現(xiàn)在協(xié)程的執(zhí)行結(jié)果已經(jīng)不再被需要了戈鲁,這就需要用到協(xié)程的取消恬砂, launch 函數(shù)返回了一個可以被用來取消運(yùn)行中的協(xié)程的 Job
suspend fun main() {
val job = GlobalScope.launch {
repeat(1000) { i ->
println("job: I'm sleeping $i ...")
delay(500L)
}
}
delay(1300L) // 延遲一段時間
println("main: I'm tired of waiting!")
job.cancel() // 取消該作業(yè)
job.join() // 等待作業(yè)執(zhí)行結(jié)束
println("main: Now I can quit.")
}
2.協(xié)程作用域內(nèi)取消的機(jī)制
取消一個協(xié)程作用域?qū)⑼瑫r取消此作用域下的所有子協(xié)程
suspend fun getResultOne():String{
delay(1000)
return "one"
}
suspend fun getResultTwo():String{
delay(1000)
return "two"
}
suspend fun main() {
var job= Job()
val scope= CoroutineScope(job)
scope.launch {
val job1 = launch {
val resultOne = getResultOne()
log(resultOne)
}
val job2 = launch {
val resultTwo = getResultTwo()
log(resultTwo)
}
// delay(500)
// job1.cancel()
log("three")
}
// .join()
delay(100)
job.cancel()
}
打印結(jié)果:
15:14:25:079 [DefaultDispatcher-worker-1,12] three
被取消的子協(xié)程不會影響到其他同級的協(xié)程
修改上面例子
suspend fun main() {
var job= Job()
val scope= CoroutineScope(job)
scope.launch {
val job1 = launch {
val resultOne = getResultOne()
log(resultOne)
}
val job2 = launch {
val resultTwo = getResultTwo()
log(resultTwo)
}
delay(500)
job1.cancel()
log("three")
}
.join()
delay(100)
// job.cancel()
}
打印結(jié)果:
15:13:21:282 [DefaultDispatcher-worker-1,12] three
15:13:21:757 [DefaultDispatcher-worker-1,12] two
在我們使用mvvm框架時候帚称,在ViewModel 中我們可以使用viewModelScope官研,不需要我們自己創(chuàng)建,也不需要我們自己手動取消