runBlocking 作用域启动协程
阻塞协程构造器
适用于单元测试的场景,而业务开发中不会用到这种方法
调用了 runBlocking 的主线程会一直 阻塞 直到 runBlocking 内部的协程执行完毕。GlobalScope 作用域启动协程
非阻塞协程构造器
生命周期受整个应用程序的生命周期限制,且不能取消CoroutineScope 作用域启动协程
非阻塞协程构造器
通过 context 参数去管理和控制协程的生命周期声明自己作用域
它会创建一个协程作用域并且在所有已启动子协程执行完毕之前不会结束runBlocking 与 coroutineScope 作用域的区别
在于后者在等待所有子协程执行完毕时不会阻塞当前线程。普通函数在协程中使用导致的异常
Error: Kotlin: Suspend functions are only allowed to be called from a coroutine or another
suspend function挂起函数,只能在协程中使用设置取消协程的执行
val job = launch {
repeat(1000) { i ->
println("job: I'm sleeping $i ...")
delay(500L)
}
}
job.cancel() // 取消该作业
job.join() // 等待作业执行结束
有一个可以使 Job 挂起的函数 cancelAndJoin 它合并了对 cancel 以及 join 的调用设置超时
withTimeout(1300L) {
repeat(1000) { i ->
println("I'm sleeping $i ...")
delay(500L)
}
}
该函数会跑出TimeoutCancellationException 异常
可以使用 withTimeoutOrNull代替,通过返回 null 来进行超时操作,从而替代抛出一个异常
val result = withTimeoutOrNull(1300L) {
repeat(1000) { i ->
println("I'm sleeping $i ...")
delay(500L)
}
"Done" // 在它运行得到结果之前取消它
}
println("Result is $result")
待续