请稍等 ...
×

采纳答案成功!

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

协程resume次数的问题

图片描述
我说下我的理解老师看看对不对。
n为0的时候。
首先会有1次continuation的resume.
然后会有1次completion的resume. 如果不是真正的挂起,直接把返回结果。 如果是真的挂起(比如切了线程),返回的是一个挂起标志。等真正执行完成的时候,还会再一次调用completion的resume返回结果。 总共会有2到3次resume

每有一个挂起点,就会有一次continuation的resume.和1次(假挂起时)到2次(真挂起时)的completion的resume

就是协程中如果有n个挂起,resume的次数应该是 2+2n次(全是假挂起) 到3+3n次(全是真挂起)

正在回答

4回答

bennyhuo 2020-11-19 08:39:29

completion跟挂起点没关系,只在协程执行完成后调用,所以你的理解有问题的。

1 回复 有任何疑惑可以回复我~
  • 提问者 压缩疯雷 #1
    回调的时候不是通过completion的resume?
    回复 有任何疑惑可以回复我~ 2020-11-19 09:01:37
  • bennyhuo 回复 提问者 压缩疯雷 #2
    completion是整个协程执行完调用的,跟挂起点没直接关系。
    回复 有任何疑惑可以回复我~ 2020-11-21 06:49:16
  • 提问者 压缩疯雷 #3
    非常感谢!
    回复 有任何疑惑可以回复我~ 2020-11-21 11:02:59
qq_逆袭_8 2021-03-02 18:46:50

suspend {}.startCoroutine()无挂起点启动的时候 源码中执行一次resume

.startCoroutine(object : Continuation<Unit> {

override fun resumeWith(result: Result<Unit>){}

)结束的时候接口中执行一次,

suspend fun getSure() = suspendCoroutine<Unit> {
   thread {
       println("getSure  with")
       it.resume(Unit)
   }
}

suspend {

getSure()
}.startCoroutine()

启动一个挂起点就是 1+2

添加N个挂起点就是N+2

0 回复 有任何疑惑可以回复我~
bennyhuo 2020-11-19 08:37:52

n个挂起点恢复时调用n次,启动协程时一次,这就是n+1次。

如果算上完成回调,就是n+2次。

0 回复 有任何疑惑可以回复我~
慕前端9039556 2020-11-18 23:27:02

别纠结这个,没用。老师视频里说n+2书里说n+1。所以这是个无解的。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信