【发布时间】:2021-06-06 12:15:21
【问题描述】:
我正在尝试异步逐行从服务器下载数据。其实我用的是Kotlin Coroutines,但是当我在async lambda块中连接httpurlconnection时,它显示了一个警告,该方法将在那里被阻塞,所以我无法异步执行请求。
这是代码:
fun download(urlString : String) = runBlocking{
val url = URL(urlString)
val httpurlconnection = url.openConnection() as HttpURLConnection
httpurlconnection.setRequestMethod("GET")
val response = async {
httpurlconnection.connect()
val scanner = java.util.Scanner(httpurlconnection.inputstream)
val sb = StringBuilder()
while(scanner.hasNextLine()){
val string = scanner.nextLine()
println(string)
sb.append(string)
}
sb.toString()
}
println("length of response = ${response.length}")
}
【问题讨论】:
-
如果你要构建一个完整的字符串,那么逐行阅读正文有什么意义?为什么要立即将整个流读入字符串?
-
另外,你到底想在这里做什么异步?在您当前的代码中,
download()处于阻塞状态:在完全下载正文之前它不会返回。您可能应该在这里多解释一下您要实现的目标。您是否希望download()完全异步,因为调用者可以在下载发生时继续前进? -
我已经编辑了问题以删除查找库的请求,因为我认为这是 XY 问题的结果,核心问题是其他人将来可能会遇到的问题,并且有一个很好的解决它的答案。在修改后的状态下,我认为应该重新提出问题。
标签: kotlin asynchronous kotlin-coroutines