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上的提问帖

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值