使用 Kotlin Coroutine 包装 okhttp3 enqueue() 发生 ClassCastException?

发布于 2022-09-05 11:03:35 字数 1610 浏览 29 评论 0

使用 Kotlin 协程包装 enqueue() 时, 总是会发生java.lang.ClassCastException: java.lang.Object cannot be cast to okhttp3.Response 这样的异常. 通过调试也没搞明白原因.

下面是正确的简单用例:

suspendCoroutine<Int> {co -> co.resume(1)} // ok

suspendCoroutine<Int> {co -> co.resumeWithException(NullPointerException())} // ok

下面是发生错误的用例:

val http = OkHttpClient.Builder().build()
    val appid = "mock"
    val secret = "mock"
    val code = "mock"

    val api = "https://api.weixin.qq.com/sns/jscode2session?appid=${appid}&secret=${secret}&js_code=${code}&grant_type=authorization_code"
    val request = Request.Builder().get().url(api).build()

    val cc =
            runBlocking {
                val resp = suspendCoroutine<Response> { co ->
                    http.newCall(request).enqueue(object : Callback {
                                override fun onFailure(call: Call, e: IOException) {
                                    co.resumeWithException(e)
                                }

                                override fun onResponse(call: Call, response: Response) {
                                    // 此处 response 是正确的.
                                    co.resume(response)
                                }
                            })
                }

                // Exception in thread "main" java.lang.ClassCastException: java.lang.Object cannot be cast to okhttp3.Response
                println(resp.body()?.string())

                resp
            }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

养猫人 2022-09-12 11:03:35

不清楚但 http.newCall(request).enqueue(object : Callback) 已经是异步调用了。

--- 补充

可以参考如何用Kotlin Coroutines和Architecture Components进行Android开发?,学习Kotlin Coroutines。

绝情姑娘 2022-09-12 11:03:35

执行了你贴出的部分代码, 没报错, 输出

{"errcode":40013,"errmsg":"invalid appid, hints: [ req_id: FAgFOA0052th44 ]"}

使用

ext.kotlin_version = "1.1.4-2"
kotlinx-coroutines-core:0.18
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文