请稍等 ...
×

采纳答案成功!

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

关于 runSuspend 的问题

我把 RunSuspend.kt 的内容拷贝到我自己的文件中:

@SinceKotlin("1.3")
internal fun runSuspend(block: suspend () -> Unit) {
    val run = RunSuspend()
    block.startCoroutine(run)
    run.await()
}

private class RunSuspend : Continuation<Unit> {
    override val context: CoroutineContext
        get() = EmptyCoroutineContext

    var result: Result<Unit>? = null

    override fun resumeWith(result: Result<Unit>) = synchronized(this) {
        this.result = result
        @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") (this as Object).notifyAll()
    }

    fun await() = synchronized(this) {
        while (true) {
            when (val result = this.result) {
                null -> @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") (this as Object).wait()
                else -> {
                    result.getOrThrow() // throw up failure
                    return
                }
            }
        }
    }
}

然后反编译:

public final class RunSuspend1Kt {
   @SinceKotlin(
      version = "1.3"
   )
   public static final void runSuspend(@NotNull Function1 block) {
      Intrinsics.checkParameterIsNotNull(block, "block");
      RunSuspend run = new RunSuspend();
      ContinuationKt.startCoroutine(block, (Continuation)run);
      run.await();
   }
}

发现 runSuspend 的参数变成了一个 Function1 实例了;

但是在 kotlin 里面是一个 block: suspend () -> Unit

我在跟踪 suspend main 的时候也发现这个问题了,这是为什么呢?为啥不是一个 Continuation 呢???

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

2回答

bennyhuo 2020-10-16 18:33:04

这题我讲过的哈,suspend 函数本质上的类型是在参数列表里面加了一个 Continuation

suspend () -> Unit 的类型实际上是 (Continuation) -> Unit

1 回复 有任何疑惑可以回复我~
  • 提问者 xxxxjase普通 #1
    老师,我的意思是反编译生成的 runSuspend 函数的参数是一个 Fuction1 哦
    回复 有任何疑惑可以回复我~ 2020-10-16 18:39:55
  • bennyhuo 回复 提问者 xxxxjase普通 #2
    Function1 有什么问题吗
    回复 有任何疑惑可以回复我~ 2020-10-16 18:42:44
  • 提问者 xxxxjase普通 回复 bennyhuo #3
    感觉不对哦,因为 GlobalScope.launch 的参数也是一个 suspend block 结果他生成了一个 SuspendLambda 为啥子这里只是一个 Fuction 了呢。
    回复 有任何疑惑可以回复我~ 2020-10-16 18:45:25
提问者 xxxxjase普通 2020-10-16 17:54:07

老师记得回复哦

0 回复 有任何疑惑可以回复我~

相似问题

登录后可查看更多问答,登录/注册

问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信