type
status
date
slug
summary
tags
category
icon
password
挂起函数
Kotlin 编译器将使用协程的代码转换成状态机的形式。这一过程主要涉及到挂起函数的调用。
通过一个示例来探讨挂起函数:
反编译字节码如下:
从反编译字节码可以清晰看出挂起函数挂起和恢复的流程。挂起函数实现的本质还是回调,只是这层回调是编译器帮我们做了。
挂起与恢复的实现
挂起和恢复的实现是通过 Continuation(续体)来完成的。每个挂起函数都接受一个 Continuation 参数,这个参数包含了协程在挂起点之后继续执行的所有信息。
- Continuation:续体是协程挂起和恢复的关键。它持有协程的上下文信息,包括协程在挂起时的状态和恢复执行时应当执行的代码位置。
- 回调的转换:挂起函数通常会将异步操作转换为同步操作的形式。这是通过将 Continuation 传递给异步操作,然后在异步操作完成时调用 Continuation 的 resumeWith 方法来实现的。
- 状态机转换:编译器将含有挂起点的协程代码转换成一个状态机(其实就 0、1 两个状态)。每个挂起点都对应状态机中的一个状态。编译器为协程生成的代码负责在挂起点之间转移,并在适当的时候恢复执行。