1.协程取消
一个用户关闭了一个启动了协程的界面,那么现在协程的执行结果已经不再被需要了,这就需要用到协程的取消, launch 函数返回了一个可以被用来取消运行中的协程的 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() // 取消该作业
job.join() // 等待作业执行结束
println("main: Now I can quit.")
}
2.协程作用域内取消的机制
取消一个协程作用域将同时取消此作用域下的所有子协程
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()
}
打印结果:
15:14:25:079 [DefaultDispatcher-worker-1,12] three
被取消的子协程不会影响到其他同级的协程
修改上面例子
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()
}
打印结果:
15:13:21:282 [DefaultDispatcher-worker-1,12] three
15:13:21:757 [DefaultDispatcher-worker-1,12] two
在我们使用mvvm框架时候,在ViewModel 中我们可以使用viewModelScope,不需要我们自己创建,也不需要我们自己手动取消