OkHttp中 response.body().string()只能调用一次分析~~~
Posted Milliejee
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OkHttp中 response.body().string()只能调用一次分析~~~相关的知识,希望对你有一定的参考价值。
好久好久没更新博客了,寒假都一直忙着准备找实习写简历 结果 投了好多家都没一个电话 哭哭了~~
所以下午想了想还是坚持更博吧 找不到实习就不找了,来没人认识的地方立个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上的提问帖
以上是关于OkHttp中 response.body().string()只能调用一次分析~~~的主要内容,如果未能解决你的问题,请参考以下文章
OkHttp中 response.body().string()只能调用一次分析~~~
OkHttp中 response.body().string()只能调用一次分析~~~
OkHttp中 response.body().string()只能调用一次分析~~~
OkHttp踩坑记:为何 response.body().string() 只能调用一次?