在协程内部使用OkHTTPClient()总是抛出警告“调用了不适当的阻止方法”

问题描述 投票:0回答:1

在协程内部调用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()警告,指出调用了不合适的阻塞方法。请告诉我正确的方法。

android-studio okhttp kotlin-coroutines
1个回答
0
投票

OkHttp提供两种并发模式

  1. 通过执行同步阻止
  2. 通过排队异步非阻塞

除了您使用的大多数这些框架之外,还有在不同模式和不同框架之间转换的桥接方法。

您应该使用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图像加载库的另一个示例,该框架本身可以实现而不是使用库,因此该框架是有意义的

https://github.com/coil-kt/coil/blob/0af5fe016971ba54518a24c709feea3a1fc075eb/coil-base/src/main/java/coil/util/Extensions.kt#L45-L51

internal suspend inline fun Call.await(): Response {
    return suspendCancellableCoroutine { continuation ->
        val callback = ContinuationCallback(this, continuation)
        enqueue(callback)
        continuation.invokeOnCancellation(callback)
    }
}

https://github.com/coil-kt/coil/blob/a17284794764ed5d0680330bfd8bca722a36bb5e/coil-base/src/main/java/coil/util/ContinuationCallback.kt

© www.soinside.com 2019 - 2024. All rights reserved.