采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
协程在生成过程中有两个Continuation,那么协程内的挂起函数获得的应该是创建的那一个,对吗?suspendCoroutine所获取的当前Continuation也是创建的那一个,对吗?
感谢同学的意见~
同学提到的“非常感谢老师的解答,我已经搞懂了。看了suspendCoroutine的源码,了解了SafeContinuation,才明白些。所以建议老师把挂起函数的它completion是谁能讲出来,相信大家理解会好一些。理解completion是谁真的很重要,理解了它对明白协程的运行轨迹很重要。下面是我在学习时总结的,自认为是对的”
协程当中总共有两个 Continuation,一个是协程自己,也就是我们创建出来的,还有一个是 completion,是我们传给协程的,这个点确实比较重要,视频里面也有重点讲哈。
我的疑问主要是在于看看是不是视频里面讲到不够清楚,我贴几个视频位置,同学有空了帮忙看下是否能够解决同学的问题,如果需要改进我后面可以补充些说明:
这页ppt讲的内容在视频的 11-5 的 12:56 左右,讲的内容其实就是在介绍这两个 Continuation 具体指的是什么。
同时对于 SafeContinuation 与上面的二者的关系,也在视频的 11-6 06:00 前后有讲解,这里也包括了对 SafeContinuation 的介绍:
后面其实还有一个更清楚的例子,就是用 Java 代码对照,在视频 11-6 06:35 前后,这个例子里面为了让大家更方便的理解,左右对照了 Java 的代码(其实就是协程本质上的实现)和 Kotlin 协程,这里也能看到 completion 以及协程本身的 Continuation 实例:
最后的这个例子由于是很早的时候我在其他课程里讲到的,因此没有在源码当中,稍后我把源码也上传一下,这样大家就可以自己运行了。
---- update ----
最后的这张ppt里的源码上传了:ContinuationImpl,同学可以试着自己运行一下~
没错,是这样的。ppt里面有个图,给出了suspendlambda safecontinuation 和拦截器的关系可以参考下
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,这不成了死循环了吗?迷糊了
两者不是同一个,建议复习一下11.4节哈。协程创建时,做为参数传入的completion是我们自己在外部创建的,做为协程执行完成之后被调用的回调;而通过suspendcoroutine拿到的continuation是启动协程时创建出来的,这两不是同一个。
刚看了下,在11.5节 13:00处有讲到这两个。可以复习下哈
登录后可查看更多问答,登录/注册
如果有一门语言可以取代Java,那么它一定是Kotlin。
1.5k 4
1.6k 1
397 1
233 20
1.4k 16