首页 > 解决方案 > OkHttp 是否通过 ResponseBody#string 执行网络读取?

问题描述

SocketTimeoutException在访问string()OkHttp3 上的方法时收到一个ResponseBody

var response: Response?
try {
    response = client.newCall(request).execute()
} catch (exception: IOException) { ... }

val result = response.body()?.string()

显然,发生崩溃是因为SocketTimeoutException发生在我的 try/catch 之外。我最初的印象是execute()执行整个网络交互,但我的堆栈跟踪讲述了一个不同的故事。

Caused by java.net.SocketTimeoutException: timeout
       at okio.Okio$4.newTimeoutException(Okio.java:232)
       at okio.AsyncTimeout.exit(AsyncTimeout.java:285)
       at okio.AsyncTimeout$2.read(AsyncTimeout.java:241)
       at okio.RealBufferedSource.read(RealBufferedSource.java:47)
       at okhttp3.internal.http1.Http1Codec$AbstractSource.read(Http1Codec.java:363)
       at okhttp3.internal.http1.Http1Codec$ChunkedSource.read(Http1Codec.java:453)
       at okio.Buffer.writeAll(Buffer.java:1135)
       at okio.RealBufferedSource.readString(RealBufferedSource.java:199)
       at okhttp3.ResponseBody.string(ResponseBody.java:176)
       at com.my.company.Service.sendUpdate(Service.kt:274)

查看 OkHttp 文档和堆栈跟踪,确实似乎正在进行网络交互,但我想验证它是否与我之前的理解背道而驰。

标签: androidokhttp

解决方案


推荐阅读