在协程内部调用OkHTTP客户端的正确方法是什么?
CoroutineScope(IO).launch {
val request = Request.Builder()
.url("${host}/dots")
.build()
val client = OkHttpClient()
client.newCall(request).enqueue(object: Callback{
override fun onFailure(call: Call, e: IOException) {
isConnected.postValue(false)
}
override fun onResponse(call: Call, response: Response) {
val loadingStr = response.body()?.string().toString()
loadingStrings = loadingStr
Log.i("My_Error",loadingStrings)
}
})
}
在onResponse中,loadingStr变量显示string()警告,指出调用了不合适的阻塞方法。请告诉我正确的方法。
OkHttp提供两种并发模式
除了您使用的大多数这些框架之外,还有在不同模式和不同框架之间转换的桥接方法。
您应该使用https://github.com/gildor/kotlin-coroutines-okhttp之类的库来帮助您。这段代码需要执行基本的常规路径,但也特别需要处理错误和单独取消。您的协程内部代码永远不应直接调用入队。
suspend fun main() {
// Do call and await() for result from any suspend function
val result = client.newCall(request).await()
println("${result.code()}: ${result.message()}")
}
这是来自Coil图像加载库的另一个示例,该框架本身可以实现而不是使用库,因此该框架是有意义的
internal suspend inline fun Call.await(): Response {
return suspendCancellableCoroutine { continuation ->
val callback = ContinuationCallback(this, continuation)
enqueue(callback)
continuation.invokeOnCancellation(callback)
}
}