OkHttp中 response.body().string()只能调用一次分析~~~
来源:互联网 发布:mac如何安装dmg 编辑:程序博客网 时间:2024/05/29 23:22
好久好久没更新博客了,寒假都一直忙着准备找实习写简历 结果 投了好多家都没一个电话 哭哭了~~
所以下午想了想还是坚持更博吧 找不到实习就不找了,来没人认识的地方立个flag 坚持写博客啊
也算是积累。
之前写项目的时候用到了OkHttp
我有边写代码边打日志的习惯 结果 被这个坑 困了一个下午 才解决 今天才搞懂为啥
当我们第一次调用 response.body().string();
的时候
可以正确拿到数据,第二次就返回了null
就很纳闷 日志都能打出来 程序就是会崩,单步跟到这才发现,
解释一下为啥
public void onResponse(Response response) throws IOException { String result = response.body().string();// response.body().string();只能调用一次
因为response.body()也是挺大的,OkHttp不把它存储在内存中,就是你需要的时候就去读一次 只给你了内容,没有给引用,所以一次请求读一次
ok
这是语言解释 ,去源码找找答案~~
我跟了一下源码发现string()有这样一段代码:
public final String string() throws IOException { return new String(bytes(), charset().name()); }
继续找bytes()
public final byte[] bytes() throws IOException { long contentLength = contentLength(); if (contentLength > Integer.MAX_VALUE) { throw new IOException("Cannot buffer entire body for content length: " + contentLength); } BufferedSource source = source(); byte[] bytes; try { bytes = source.readByteArray(); } finally { Util.closeQuietly(source); } if (contentLength != -1 && contentLength != bytes.length) { throw new IOException("Content-Length and stream length disagree"); } return bytes; }
看!!!!我们都知道finally中的代码肯定会调用这里执行
Util.closeQuietly(source);~~~~
closeQuietly方法可以运用到各类可关闭的对象中
所以懂了
就是因为在拿过之后就把资源关闭了
所以就获取不到了,所以只能拿一次。
也算是个小坑,记录记录~~~~
解决问题参考了这个解释 git上的提问帖
4 0
- OkHttp中 response.body().string()只能调用一次分析~~~
- OkHttp请求回调中response.body().string()只能有效调用一次
- OkHttp请求回调中response.body().string()只能有效调用一次,为什么?
- OkHttp请求回调中response.body().string()只能有效调用一次问题
- OkHttp response.body().string()
- OkHttp中response.body().string()解析
- OkHttp请求回调中response.body().string()如何调用两次
- Okhttp拦截器统一异常处理并多次读取response.body().string()
- Okhttp3 中响应回来的数据response.body().string()
- HttpServetRequest读取body只能一次的问题
- okhttp发送post(json)请求数据,出现不走response.body().string(),单起一行打印的异常
- OkHttp拦截器之获取Response.body的内容
- okhttp 问题总结 response.body().contentLength() = -1
- ServletRequest中getReader()和getInputStream()只能调用一次的解决办法
- 在OnPaint中必须调用一次BeginPaint和EndPaint,且也只能调用一次。(下)
- 在OnPaint中必须调用一次BeginPaint和EndPaint,且也只能调用一次。(上)
- 在OnPaint中必须调用一次BeginPaint和EndPaint,且也只能调用一次
- 在OnPaint中必须调用一次BeginPaint和EndPaint,且也只能调用一次。(上)
- HDUOJ 1272 小希的迷宫
- 24 Point game
- percona-toolkit安装
- K-均值聚类算法(K-means algorithm)
- 注重数学检验分析,高效完成产品上线测试
- OkHttp中 response.body().string()只能调用一次分析~~~
- 测试数据库优化1
- pat L3-010是否完全二叉搜索树(静态建树 层次遍历)@
- 单链表的基本操作
- 数据库MySql类库系列(四)-QueryOperatorSelect
- Python基础练习——字符串和字典的转换
- 137. Single Number II(C++)
- python抓取历年特码开奖记录
- 前端练习