不适当的阻塞方法调用



即使与IO上下文一起使用,也会出现此警告。我的代码:

override fun download(url: String, file: File): Flow<Long> = flow {
var total: Long = 0
var count: Long = 0
withContext(Dispatchers.IO) {
val client = OkHttpClient()
val req = Request.Builder().url(url).build()
val response = client.newCall(req).**execute**()
val sink: BufferedSink = Okio.buffer(Okio.**sink**(file))
response.body()?.let {
while (count != -1L) {
count = it.source().**read**(sink.buffer(), 2048)
if (count == -1L) break
sink.**emit**()
total = total.plus(count)
withContext(Dispatchers.Default) {
emit(total.times(100).div(it.contentLength()))
}
}
}
sink.**close**()
}
}

大胆的部分正在受到警告。代码有什么问题吗?或者警告不应该出现?

这些方法调用可以引发IOException,并在suspend方法内部调用。这些都被标记为可能正在阻止呼叫。编译器警告忽略了Dispatchers.IO的微妙之处。

通常情况下,最好的选择是使用enqueue((切换到异步模式,或者将其放在隐藏这些警告的库函数后面。像图书馆https://github.com/gildor/kotlin-coroutines-okhttp还可以帮助在OkHttp中的阻塞代码和协同程序之间架起桥梁。

最新更新