android - 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 文档和堆栈跟踪,确实似乎正在进行网络交互,但我想验证它是否与我之前的理解背道而驰。
- 是否
string()
执行可能超时的网络操作? - 如果是这样,有什么作用
client.newCall(request).execute()
?
解决方案
推荐阅读
- scala - IntelliJ IDEA 在升级到 2019.3.3 后停止为 Scala 项目提供 Run... 命令
- javascript - 过滤掉日期返回空白数组
- r - 收敛问题 glmer:如何解释 allFit 结果并比较具有不同优化器的模型
- javascript - 开始使用 amMaps
- java - 如何从另一个类访问 DefaultTableModel
- c++ - 默认从索引构造 std::variant
- handwriting-recognition - 手写文本识别中的变音符号识别
- reactjs - Fetch 似乎在 React 中的客户端上执行
- json - 尝试解析 json 时位置 0 处的意外字符 (g) - HttpResponseDecorator
- matplotlib - 在 Jupyter 笔记本中调试交互式 matplotlib 图形