我的理解是Kotlin的协程是库,它在Kotlin中保留了唯一的语言级并发功能,即suspend
关键字。
我仍然在Kotlin的协程中忙个不停,但是我想知道这是否对我的问题来说矫kill过正,我的问题是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)
等待{{1}填充s
}}?
答案 0 :(得分:2)
“然后在其他地方”部分调用getStringFromNetwork()
,因此它不会在suspend
函数(包括suspend
lambda)之外进行编译,并且只能在协程内部执行。
同时将调用baz(),而bar等待s由getStringFromNetwork填充?
否,如果以这种方式编写,则baz()
仅在返回bar(s)
之后才开始执行。但是当然bar(s)
可以启动一个新的协程,它将完成实际工作。