使用 Kotlin Coroutine 包装 okhttp3 enqueue() 发生 ClassCastException?
使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
不清楚但
http.newCall(request).enqueue(object : Callback)
已经是异步调用了。--- 补充
可以参考如何用Kotlin Coroutines和Architecture Components进行Android开发?,学习Kotlin Coroutines。
执行了你贴出的部分代码, 没报错, 输出
使用