协程三大做用域

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 来进行超时操做,从而替代抛出一个异常
bash

val result = withTimeoutOrNull(1300L) {
    repeat(1000) { i ->
            println("I'm sleeping $i ...")
        delay(500L)
    }
    "Done" // 在它运行获得结果以前取消它
}
println("Result is $result")

复制代码


待续函数

相关文章
相关标签/搜索