原文地址https://blog.csdn.net/qq_25184739/article/details/71970817
使用okhttp3的时候遇到的异常:java.lang.IllegalStateException: closed。原因是流已经关闭,所以无法再进行操作。
问题再现:
在Callback方法中调用了两次response.body().string()。导致错误的出现。
public abstract class myCallback extends Callback<Bundle> {
@Override
public Bundle parseNetworkResponse(Response response, int id) throws Exception {
//打印log,查看
Log.d("test", response.body().string());
//获取body进行逻辑处理
String result = response.body().string();
backJsonObject = new JSONObject(result);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
真正原因:
因为是调用Response的body方法,所以查看源码Response.class
发现
public ResponseBody body() {
return this.body;
}
- 1
- 2
- 3
又因为body是一个ResponseBody 对象。所以查看ResponseBody 类的源码。
private final ResponseBody body;
- 1
发现它的string()方法的源代码如下:
public final String string() throws IOException {
BufferedSource source = source();
try {
Charset charset = Util.bomAwareCharset(source, charset());
return source.readString(charset);
} finally {
Util.closeQuietly(source);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
注意finally中的Util.closeQuietly(source);它是一个关闭流的工具方法,所以此时你再次调用这个方法,就会报文章开头的错误:流已经关闭。所以请不要多次调用response.body().string();