加餐五 | 深入理解协程基础元素
协程基础元素
- 深入了解
- 翻译
- 解释
- 总结
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-2413 - Paul ShansuspendCoroutine 用了SafeContinuation,里面有原子读和一些状态判断,应该是处理多线程和重复resume的问题。
作者回复: 是的,这也是它们的一大差异。
2022-03-254 - 辉哥suspendCoroutine{}能保证suspendCoroutine的挂起点(也就是传入lambda的continuation参数)只会被resume一次.因为实际上传入的continuation为SafeContinuation,多次调用会抛异常,可以规范用户的使用
作者回复: 很棒的答案。
2022-03-232 - ZircoNsuspendCoroutineUninterceptedOrReturn 这个方法在IDE里为啥没法引用到?
作者回复: 如果你去源码里看“kotlin.coroutines.intrinsics.Intrinsics.kt”当中的suspendCoroutineUninterceptedOrReturn(),就可以找到引用了。不要去找IntrinsicsJvm.kt里面的,因为它只是JVM层的具体实现。
2022-04-181 - ACE_Killer09对于 代码段 10 和 11 suspendCoroutineUninterceptedOrReturn 必须要考虑返回值,如果return的不是COROUTINE_SUSPENDED,就不是一个真正的挂起函数。而如果是使用 suspendCoroutine suspendCancellableCoroutine,就不用考虑返回值,他们一定是挂起的,只要最后通过Continuation 返回值即可。 另外 Continuation中 resume resumeWith resumeWithException 的原理都是 resumewith 这三个具体应用场景除了传入值区别 还有 其他区别吗?
作者回复: 很棒的答案~ resume resumeWith resumeWithException 的原理都是 resumewith(),它们的区别主要是值的区别。当然,它传入的值的类型,也会影响协程的后续执行流程,比如说,如果是传入了异常信息,那么协程内部就要处理相关的异常逻辑了。
2022-04-121 - 杨小妞Continuation 的resumeWith函数只有在,回调函数转挂起函数或者java调用挂起函数的时候才发挥作用吗? 在挂起函数执行挂起函数的状态机里面,好像没看到resumeWith的影子
作者回复: 27讲当中的状态机只是没有体现出resumeWith而已,实际上,挂起函数可以通过两种方式返回,可能是resumeWith,也可能是直接return返回。
2022-03-291 - anmi前面看了那么多次没有感觉,现在反应过来了:函数也能类型强转!!!!!2023-12-04归属地:江苏
- EmmmsuspendCoroutine可以理解为会阻塞外层协程吧,这样就可以实现同步得到耗时任务回调出来的结果,然后进行后续的操作,这样的话看外层协程作用域的代码就是顺序同步执行2022-07-06