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

    作者回复: 很棒的答案!

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

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

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

    作者回复: 很棒的答案。

    
    2
  • ZircoN
    2022-04-18
    suspendCoroutineUninterceptedOrReturn 这个方法在IDE里为啥没法引用到?

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

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

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

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

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

    
    1
  • Emmm
    2022-07-06
    suspendCoroutine可以理解为会阻塞外层协程吧,这样就可以实现同步得到耗时任务回调出来的结果,然后进行后续的操作,这样的话看外层协程作用域的代码就是顺序同步执行
    
    