什么是暂停协程?

What is suspendCoroutine?

我是初学者coroutines.

不完全是,但我对coroutine是什么有点了解。

suspend function也比较难,但稍微了解一下。

正在按部就班地学习,但有些地方还是不懂。

那是 suspendCoroutine。在示例代码中,出现了块中使用的suspendCoroutineContinuation,但我不知道这两个是什么。

我在其他网站上看过,但找不到任何地方可以轻松解释它。

您能简单地解释一下 suspendCoroutineContinuation 的用途吗?如果可能,请举例说明?

suspendCoroutine是一个构建函数,主要用于将回调函数转换为suspend函数。例如,假设您有一些使用回调的遗留(或没有)Api。您可以轻松地将其转换为 suspend 函数以在协程中调用它。例如:

suspend fun getUser(id: String): User  = suspendCoroutine { continuation ->
      Api.getUser(id) { user ->
          continuation.resume(user)
      }
}

这里我们有一个 Api 函数 getUser,它在 Api class 中定义,例如:

fun getUser(id: String, callback: (User) -> Unit) {...}

suspendCoroutine 暂停执行它的协程,直到我们决定通过调用适当的方法继续 - Continuation.resume...suspendCoroutine 主要在我们有一些带有回调的遗留代码时使用。

使用 suspendCoroutine 将回调转换为 suspend 函数使得代码在您使用 suspend 函数时是连续的。

例如,而不是像这样的回调地狱:

Api.getUser(id) { user ->
      Api.getProfile(user) { profile ->
          Api.downloadImage(profile.imageId) { image ->
              // ...
          }
      } 
}

suspendCoroutine 应用到这些回调并将它们转换为 suspend 函数后,代码将如下所示:

val user = getUser(id)
val profile = getProfile(user)
val image = downloadImage(profile.imageId)
//...