|
| 1 | +--- |
| 2 | +Kotlin Coroutine |
| 3 | +--- |
| 4 | + |
| 5 | +#### 目录 |
| 6 | + |
| 7 | +1. 启动协程的三种方式 |
| 8 | +2. 挂起函数 |
| 9 | + |
| 10 | +#### 启动协程 |
| 11 | + |
| 12 | +启动协程有三种方式,分别是 launch、runBlocking、async。 |
| 13 | + |
| 14 | +launch 不会阻塞当前程序的执行流程,也无法获取协程的执行结果。它有点像是生活中的射箭。 |
| 15 | + |
| 16 | +runBlocking 可以获取协程的执行结果,但这种方式会阻塞代码的执行流程,因此它一般用于测试用途,生产环境当中是不推荐使用的。 |
| 17 | + |
| 18 | +async,则是很多编程语言当中普遍存在的协程模式。它像是结合了 launch 和 runBlocking 两者的优点。它既不会阻塞当前的执行流程,还可以直接获取协程的执行结果。它有点像是生活中的钓鱼。 |
| 19 | + |
| 20 | +#### 挂起函数 |
| 21 | + |
| 22 | +挂起函数可以极大地简化异步编程,让我们能够以同步的方式写异步代码。相比 "回调地狱" 式的代码,挂起函数写出来的代码可读性更好、扩展性更好、维护性更好,也更难出错。 |
| 23 | + |
| 24 | +1. 要定义挂起函数,只需要加上 suspend 关键字。这个关键字会改变函数类型的。 |
| 25 | +2. 挂起函数拥有挂起和恢复的能力,因此对于同一行代码来说,"=" 左右两边的代码分别可以执行在不同的线程之上。 |
| 26 | +3. 挂起函数的本质,就是 Callback。在 Kotlin 中被称为 Continuation。而 Kotlin 编译器将 suspend 翻译成 Continuation 的过程,则是 CPS 转换。这里的 Continuation 是代表了 "程序继续运行下去需要执行的代码"、"接下来要执行的代码" 或者 "剩下的" 代码。 |
| 27 | + |
| 28 | +挂起函数,只能在协程当中被调用,或者是被其他挂起函数调用。但协程中的 block,本质上仍然是挂起函数。 |
| 29 | + |
| 30 | +所以我们可以认为,挂起和恢复是协程的一种底层能力;而挂起函数则是一种上层的表现形式。 |
0 commit comments