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() 只能调用一次?

解决Okhttp3使用post请求后的response.body()为空

OkHttp踩坑记:为何 response.body().string() 只能调用一次?