协程四(CoroutineScope)
2023-07-06 本文已影响0人
coke613
定义协程必须指定其CoroutineScope,它会跟踪所有协程,同样它还可以跟踪取消它所启动的协程.
协程作用域:
-
GlobalScope. 生命周期是process 级别的,即时Activity 或 fragment已经销毁,协程仍然在执行.
-
MainScope. 在Activity 中使用,可以在onDestroy()中取消.
-
viewModelScope. 只能在ViewModel 中使用,绑定ViewModel 的生命周期.
-
lifecycleScope. 只能在Activity,fragment 中使用,会绑定Activity 和 Fragment生命周期.
coroutineScope 与runBlocking 协程作用域
- runBlocking是常规函数,而coroutineScope 是挂起函数.
- 它们都会等待其协程以及所有子协程结束, 主要区别在于runBlocking 方法会阻塞当前线程来等待,而coroutineScope只是挂起,会释放底层线程用于其他用途.
coroutineScope 与 supervisorScope 协程作用域
- coroutineScope: 一个协程失败了,所有其他兄弟协程也会被取消
- supervisorScope: 一个协程失败了,不会影响其他兄弟协程
runBlocking {
coroutineScope {
val job1 = launch {
delay(400)
println("job1 fininsh")
}
val job2 = launch {
delay(200)
println("job2 fininsh") // ① 程序打印 job2 fininsh
throw IllegalArgumentException() // ② 程序崩溃 协程体取消
}
}
}
runBlocking {
coroutineScope {
val job1 = launch {
delay(400)
println("job1 fininsh") // ② 程序打印 job1 fininsh
}
val job2 = async {
delay(200)
println("job2 fininsh") // ① 程序打印 job2 fininsh
"HHH"
throw IllegalArgumentException()
}
}
}