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
原创粉丝点击