请稍等 ...
×

采纳答案成功!

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

关于挂起函数的问题

suspend {
    test1()
}.startCoroutine(object : Continuation<Unit> {
    override val context: CoroutineContext = EmptyCoroutineContext

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

})
suspend fun test1() {
    test2()
}

suspend fun test2(): Int = suspendCoroutine<Int> {
    thread {
        it.resume(3)
    }
}```
老师好,如果像我这么写test2中的it指的是哪个continuation,能跟我说说里面continuation的关系吗,感觉有点乱了。还有就是能看到给我们生成的那个SuspendLambda类吗,如果能看应该怎么看

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

3回答

bennyhuo 2020-05-18 18:28:16

我看了下你之前也提过类似的问题,你在本节提的上一个问题里面我把Java代码模拟协程的逻辑的源码上传了,不知道同学有没有看到?

0 回复 有任何疑惑可以回复我~
  • 提问者 不是蠢名字 #1
    我看过了,我是对这种suspend函数调用suspend这种嵌套的不太理解。我先说一下我的理解,首先会生成一个suspendLambda,他的resumeWith是下面这样的
       public void resumeWith(@NotNull Object o) {
            try {
                Object result = o;
                switch (label) {
                    case 0: {
                        test1()
                        result = SuspendFunctionsKt.returnSuspended(this);
                        label++;
                        if (isSuspended(result)) return;
                    }
                }
                completion.resumeWith(Unit.INSTANCE);
            } catch (Exception e) {
                completion.resumeWith(e);
            }
        }
    
    test2中的it还是指的给我们生成的那个suspendLambda吗,还是指的是test1中的completetion
    不知道我的理解是不是有问题
    回复 有任何疑惑可以回复我~ 2020-05-18 23:35:46
  • bennyhuo 回复 提问者 不是蠢名字 #2
    还是那个suspendlambda
    回复 有任何疑惑可以回复我~ 2020-05-19 19:07:25
bennyhuo 2020-05-18 18:20:57

挂起函数有个隐含的参数就是continuation,test2的 it 来自于 test1, test1的又来自于调用它的协程,想要看的话可以看下字节码,不过字节码看起来比较晦涩,建议同学重点看下视频当中我用 java 代码模拟 kotlin协程的那几页ppt来理解一下

0 回复 有任何疑惑可以回复我~
bennyhuo 2020-05-18 18:17:35

continuation的关系视频里面有呀,同学是对视频里面的这块不理解吗?

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