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

来源:12-6 案例:仿官方框架实现 async

悠闲生活

2020-03-10

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

写回答

2回答

bennyhuo

2020-03-12

感谢同学的意见~

同学提到的“非常感谢老师的解答,我已经搞懂了。看了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 实例:

//img.mukewang.com/szimg/5e69f77d09be77ca18781070.jpg


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

---- update ----

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

0
0

bennyhuo

2020-03-10

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

0
6
bennyhuo
回复
悠闲生活
同学说的我赞同,completion是要讲的,而且很关键。 我之前给出的视频里面应该有一个就是在强调这个点,不知道同学是不是觉得视频里没有表达清楚呢?
2020-03-12
共6条回复

学会Kotlin 突破开发语言瓶颈

如果有一门语言可以取代Java,那么它一定是Kotlin。

1760 学习 · 481 问题

查看课程