请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于挂起函数执行的resume是哪个Continuation的

协程在生成过程中有两个Continuation,那么协程内的挂起函数获得的应该是创建的那一个,对吗?suspendCoroutine所获取的当前Continuation也是创建的那一个,对吗?

正在回答 回答被采纳积分+3

2回答

bennyhuo 2020-03-12 16:59:32

感谢同学的意见~

同学提到的“非常感谢老师的解答,我已经搞懂了。看了suspendCoroutine的源码,了解了SafeContinuation,才明白些。所以建议老师把挂起函数的它completion是谁能讲出来,相信大家理解会好一些。理解completion是谁真的很重要,理解了它对明白协程的运行轨迹很重要。下面是我在学习时总结的,自认为是对的”

协程当中总共有两个 Continuation,一个是协程自己,也就是我们创建出来的,还有一个是 completion,是我们传给协程的,这个点确实比较重要,视频里面也有重点讲哈。

我的疑问主要是在于看看是不是视频里面讲到不够清楚,我贴几个视频位置,同学有空了帮忙看下是否能够解决同学的问题,如果需要改进我后面可以补充些说明:

//img1.sycdn.imooc.com/szimg/5e69f5d609f32ee217880930.jpg

这页ppt讲的内容在视频的 11-5 的 12:56 左右,讲的内容其实就是在介绍这两个 Continuation 具体指的是什么。

同时对于 SafeContinuation 与上面的二者的关系,也在视频的 11-6 06:00 前后有讲解,这里也包括了对 SafeContinuation 的介绍:

//img1.sycdn.imooc.com/szimg/5e69f71e09754c5a17941020.jpg

//img1.sycdn.imooc.com/szimg/5e69f73e09e98e4017621014.jpg

后面其实还有一个更清楚的例子,就是用 Java 代码对照,在视频 11-6 06:35 前后,这个例子里面为了让大家更方便的理解,左右对照了 Java 的代码(其实就是协程本质上的实现)和 Kotlin 协程,这里也能看到 completion 以及协程本身的 Continuation 实例:

//img1.sycdn.imooc.com//szimg/5e69f77d09be77ca18781070.jpg


最后的这个例子由于是很早的时候我在其他课程里讲到的,因此没有在源码当中,稍后我把源码也上传一下,这样大家就可以自己运行了。

---- update ----

最后的这张ppt里的源码上传了:ContinuationImpl,同学可以试着自己运行一下~

0 回复 有任何疑惑可以回复我~
bennyhuo 2020-03-10 22:43:49

没错,是这样的。ppt里面有个图,给出了suspendlambda  safecontinuation 和拦截器的关系可以参考下

0 回复 有任何疑惑可以回复我~
  • 提问者 悠闲生活 #1
    private suspend fun awaitSuspend() = suspendCancellableCoroutine<T> {
            continuation ->
            val disposable = doOnCompleted { result ->
                continuation.resumeWith(result)
            }
            continuation.invokeOnCancel { disposable.dispose() }
        }
    这里面的continuation应该是async中startCoroutine()创建的,对吗?如果对,那么执行它的resumeWith和completion即DefferedContinuation中的resumeWith有什么不同吗?
    如果两者是一个continuation,那么协程完成后,执行resumeWith中的notifyCompleteAll通知执行回调,回调执行的又是resumeWith,这不成了死循环了吗?迷糊了
    回复 有任何疑惑可以回复我~ 2020-03-11 10:29:32
  • bennyhuo 回复 提问者 悠闲生活 #2
    两者不是同一个,建议复习一下11.4节哈。协程创建时,做为参数传入的completion是我们自己在外部创建的,做为协程执行完成之后被调用的回调;而通过suspendcoroutine拿到的continuation是启动协程时创建出来的,这两不是同一个。
    回复 有任何疑惑可以回复我~ 2020-03-11 11:11:15
  • 刚看了下,在11.5节  13:00处有讲到这两个。可以复习下哈
    回复 有任何疑惑可以回复我~ 2020-03-11 11:13:39
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信