协程三大作用域

2,882 阅读1分钟

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")


待续