Kotlin中的suspend关键字是否可以在没有协同程序的情况下执行任何操作?

我的理解是Kotlin的协同程序是库,它将Kotlin中唯一的语言级并发特性留作 suspend 关键字 .

我想知道这对我的问题是否有点过分,一旦 HttpsURLConnection 返回数据,就会更新文本视图 . 异常处理使回调变得丑陋,以至于我想尽可能避免这些回调

suspend关键字是否只是意味着运行时可能会暂停需要一段时间才能完成的函数?或者仅在协程内启用暂停?作为一个假设,我可以写

suspend fun getStringFromNetwork(): String {
  val request = URL("https:stackoverflow.com").openConnection()
  val result = readStream(request.inputStream)
  request.disconnect()
  return result
}

//and then elsewhere
foo()
val s = getStringFromNetwork()
bar(s)
baz()

并且知道如果 getStringFromNetwork 下载1 GB的数据,同时将调用 baz() ,而 bar(s) 等待 sgetStringFromNetwork 填充?

回答(1)

2 years ago

"and then elsewhere"部分调用 getStringFromNetwork() ,因此它不会在 suspend 函数(包括 suspend lambdas)之外编译,并且它们只能在协同程序内执行 .

在此期间将调用baz(),而bar(s)等待s由getStringFromNetwork填充?

不,如果你这样写, baz() 只会在 bar(s) 返回后才开始执行 . 但是当然 bar(s) 可以开始一个新的协程,它将完成实际的工作 .