朱涛 · Kotlin 编程第一课
朱涛
Google 认证的 Kotlin、Android 开发者专家,博客“Kotlin Jetpack 实战”作者
6717 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
朱涛 · Kotlin 编程第一课
15
15
1.0x
00:00/00:00
登录|注册

加餐五 | 深入理解协程基础元素

你好,我是朱涛。
在上一讲当中,我们深入研究了 Kotlin 挂起函数的原理,实际更多的是在了解协程的“基础层”。而接下来,我们将会开始研究协程启动的原理,探索协程的“中间层”。
第 26 讲里,我曾提到过,Kotlin 的协程框架其实就是协程基础元素组合出来的框架。如果我们想要弄懂 Kotlin 协程,首先就要将它的“基础层”理解透彻。
所以今天,我还是决定来一次加餐,带你系统深入地认识一下 Kotlin 协程当中的基础元素。等你对协程的基础层有了深入认识以后,下节课研究协程启动原理就会轻松一些了。

协程基础元素

通过第 26 讲我们现在已经知道,Kotlin 协程的基础元素大致有这些:Continuation、SafeContinuation、CoroutineContext、CombinedContext、CancellationException、intrinsics。
其中的 CoroutineContext、CancellationException 我都已经介绍过了,另外的 CombinedContext,其实就是 CoroutineContext 的一个实现类,而 SafeContinuation 则是 Continuation 的实现类。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Kotlin协程的基础元素Continuation及其相关高阶函数suspendCoroutine{}和suspendCancellableCoroutine{}是本文的重点。文章深入讨论了这些元素的用法和作用,通过示例代码展示了在挂起函数内部使用Continuation对象传递程序执行结果或异常的方式。作者还通过对比异步回调代码,强调了Continuation的作用相当于Callback,既可以用于实现挂起函数,又可以用于调用挂起函数。此外,文章还展示了在Java中调用Kotlin的挂起函数的方式,强调了suspendCoroutine{}、suspendCancellableCoroutine{}这两个高阶函数在实现挂起函数逻辑时的重要性。通过深入讲解Continuation的用法和作用,本文帮助读者更加深入地理解了Kotlin协程的基础元素。文章内容涵盖了技术细节,对于想要深入了解Kotlin协程的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《朱涛 · Kotlin 编程第一课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • Allen
    关于思考题的思考: suspendCoroutine{} 或者 suspendCancellableCoroutine{} 在使用的时候,只需要知道 Continuation 接口,而接口中只有一个函数 resumeWith,相对让人比较容易和 Callback 回调关联起来,所以,使用这两个函数的成本较小,不需要对 coroutine 协程的原理有太多的理解。 而 suspendCoroutineUninterceptedOrReturn{} 函数除了需要关心 Continuation 接口外,还需要关心对应的返回值,而这个返回值中有几种状态,每种状态代表什么意思,其实在对 coroutine 原理不太清楚的情况下,是完全不知道怎么调用的。 总的来说,suspendCoroutineUninterceptedOrReturn{} 使用的学习成本要高很多。

    作者回复: 很棒的答案!

    2022-03-24
    13
  • Paul Shan
    suspendCoroutine 用了SafeContinuation,里面有原子读和一些状态判断,应该是处理多线程和重复resume的问题。

    作者回复: 是的,这也是它们的一大差异。

    2022-03-25
    4
  • 辉哥
    suspendCoroutine{}能保证suspendCoroutine的挂起点(也就是传入lambda的continuation参数)只会被resume一次.因为实际上传入的continuation为SafeContinuation,多次调用会抛异常,可以规范用户的使用

    作者回复: 很棒的答案。

    2022-03-23
    2
  • ZircoN
    suspendCoroutineUninterceptedOrReturn 这个方法在IDE里为啥没法引用到?

    作者回复: 如果你去源码里看“kotlin.coroutines.intrinsics.Intrinsics.kt”当中的suspendCoroutineUninterceptedOrReturn(),就可以找到引用了。不要去找IntrinsicsJvm.kt里面的,因为它只是JVM层的具体实现。

    2022-04-18
    1
  • ACE_Killer09
    对于 代码段 10 和 11 suspendCoroutineUninterceptedOrReturn 必须要考虑返回值,如果return的不是COROUTINE_SUSPENDED,就不是一个真正的挂起函数。而如果是使用 suspendCoroutine suspendCancellableCoroutine,就不用考虑返回值,他们一定是挂起的,只要最后通过Continuation 返回值即可。 另外 Continuation中 resume resumeWith resumeWithException 的原理都是 resumewith 这三个具体应用场景除了传入值区别 还有 其他区别吗?

    作者回复: 很棒的答案~ resume resumeWith resumeWithException 的原理都是 resumewith(),它们的区别主要是值的区别。当然,它传入的值的类型,也会影响协程的后续执行流程,比如说,如果是传入了异常信息,那么协程内部就要处理相关的异常逻辑了。

    2022-04-12
    1
  • 杨小妞
    Continuation 的resumeWith函数只有在,回调函数转挂起函数或者java调用挂起函数的时候才发挥作用吗? 在挂起函数执行挂起函数的状态机里面,好像没看到resumeWith的影子

    作者回复: 27讲当中的状态机只是没有体现出resumeWith而已,实际上,挂起函数可以通过两种方式返回,可能是resumeWith,也可能是直接return返回。

    2022-03-29
    1
  • anmi
    前面看了那么多次没有感觉,现在反应过来了:函数也能类型强转!!!!!
    2023-12-04归属地:江苏
  • Emmm
    suspendCoroutine可以理解为会阻塞外层协程吧,这样就可以实现同步得到耗时任务回调出来的结果,然后进行后续的操作,这样的话看外层协程作用域的代码就是顺序同步执行
    2022-07-06
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部