gpt4 book ai didi

android - 在协程中使用 OkHTTPClient() 总是抛出警告 "inappropriate blocking method called"

转载 作者:行者123 更新时间:2023-12-03 20:05:45 27 4
gpt4 key购买 nike

在协程中调用 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 这样的库。为你做。这段代码需要做基本的正常路径,但还具体需要处理错误和单独取消。你在协程中的代码不应该直接调用 enqueue。
    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

    OkHttp 不能直接实现这个,至少有两个原因
  • 它将添加一个依赖 Kotlin 协程库,并需要更多次要版本。
  • 这个问题不是 Kotlin 协程特有的,所以 OkHttp 会有代码来处理 RxJava 1/2/3、Spring Reactor、KTor 等。
  • 关于android - 在协程中使用 OkHTTPClient() 总是抛出警告 "inappropriate blocking method called",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62382096/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com