Kotlin 协程挂起函数原理
2024-2-22
| 2024-9-2
0  |  Read Time 0 min
type
status
date
slug
summary
tags
category
icon
password

挂起函数

Kotlin 编译器将使用协程的代码转换成状态机的形式。这一过程主要涉及到挂起函数的调用。
通过一个示例来探讨挂起函数:
反编译字节码如下:
从反编译字节码可以清晰看出挂起函数挂起和恢复的流程。挂起函数实现的本质还是回调,只是这层回调是编译器帮我们做了。

挂起与恢复的实现

挂起和恢复的实现是通过 Continuation(续体)来完成的。每个挂起函数都接受一个 Continuation 参数,这个参数包含了协程在挂起点之后继续执行的所有信息。
  • Continuation:续体是协程挂起和恢复的关键。它持有协程的上下文信息,包括协程在挂起时的状态和恢复执行时应当执行的代码位置。
  • 回调的转换:挂起函数通常会将异步操作转换为同步操作的形式。这是通过将 Continuation 传递给异步操作,然后在异步操作完成时调用 Continuation 的 resumeWith 方法来实现的。
  • 状态机转换:编译器将含有挂起点的协程代码转换成一个状态机(其实就 0、1 两个状态)。每个挂起点都对应状态机中的一个状态。编译器为协程生成的代码负责在挂起点之间转移,并在适当的时候恢复执行。

参考文档

 
  • 协程
  • OkHttp+Retrofit 使用示例Kotlin 协程异常机制
    • Utterance
    Catalog