我的理解是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)
等待 s
由 getStringFromNetwork
填充?
1 回答
"and then elsewhere"部分调用
getStringFromNetwork()
,因此它不会在suspend
函数(包括suspend
lambdas)之外编译,并且它们只能在协同程序内执行 .不,如果你这样写,
baz()
只会在bar(s)
返回后才开始执行 . 但是当然bar(s)
可以开始一个新的协程,它将完成实际的工作 .