请稍等 ...
×

采纳答案成功!

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

老师可以帮我看看这么理解resumeWith运行时序有没有问题吗?

图片描述
上图我理解的是外层suspend函数生成的continuation的resume先执行(resumeWith执行弟一次label 1)
然后遇到挂起函数a就return了一个挂起状态。(label++)
然后把自己包装成了一个safeContinuation 当做complete传递给了a。(这里我没看到a是否执行了自己的resume。不知道是否会执行?)然后a中的 it.resume(Unit)(resumeWith执行第二次 label 2)同时,外层suspend函数恢复执行。

看了代码之后还有一个小疑惑。
视频只说了如果是挂起函数会返回COROUTINE_SUSPENDED这个标记,但是没说怎么判断的这个函数是否是挂起函数。(ps:我想看看单线程延时任务是怎么判定为挂起的)

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

2回答

我敲阔爱 2021-01-02 20:56:55

SafeContinuation 是为了确保只有发生异步调用时才挂起,这么理解这句话

1 回复 有任何疑惑可以回复我~
bennyhuo 2020-08-18 12:34:47

包装为SafeContinuation是在suspendCoroutine里面做的,你看下源码就知道了。判断是否挂起很简单啊,if 返回值是这个对象,就认为是挂起,否则就当结果处理。

你看下我有个用Java代码仿协程的例子。

0 回复 有任何疑惑可以回复我~
  • 提问者 慕前端9039556 #1
    嗯嗯 。那篇java代码我看了。我就是根据那篇代码然后逆推出的上述理解。。。块理解大体上没啥问题是吧 ☺️
    回复 有任何疑惑可以回复我~ 2020-08-18 13:22:49
  • 提问者 慕前端9039556 #2
    老师,kotlin编译过后,协程程序是不是都会转为类似您编写的那篇switch case的java代码呀?
    回复 有任何疑惑可以回复我~ 2020-08-18 16:12:46
  • bennyhuo 回复 提问者 慕前端9039556 #3
    差不多就是这个意思
    回复 有任何疑惑可以回复我~ 2020-08-18 18:45:25
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信