Android -- 使用OKhttp获取response时遇到的坑

在使用OKhttp请求服务器数据时遇到`java.lang.IllegalStateException: closed`异常,该异常通常发生在尝试多次访问已关闭的数据流时。问题在于调用`response.body().string()`后数据流会被关闭,导致后续解析失败。解决办法是将响应内容先保存到字符串变量中,例如`String tempResponse = response.body().string()`,然后使用`tempResponse`进行后续操作。此解决方案成功解决了Log数据正常但解析异常的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在使用OKhttp请求服务器数据的时候,发现打印的时候显示数据正常,但是在传递到解析函数的时候发生错误:

运行到response.body().string()一步时抛异常,java.lang.IllegalStateException: closed;或者是在

JSON.parseObject(response.body().string(),ChampionListBean.class);

提示以下错误:可以看到,我Log出来的数据是正常的,但是解析的时候总是不正常。




因为是第一次使用这个OKhttp,所以总是提示没有数据,困扰了大半天。

看看我的代码:

try {
                    URL url = new URL(path);
                    Request request = new Request.Builder().url(url).build();
                    Response response = client.newCall(request).execute();
                    if(response.isSuccessful()){
                        Log.i("getResponse",response.body().string());<span style="white-space:pre">	//埋下的坑
                        ChampionListBean championListBean = JSON.parseObject(response.body().string(),ChampionListBean.class);<span style="white-space:pre">	//跳进的坑
                        parseList(championListBean);
                        /*Message message = new Message();
                        message.obj = response.body().string();
                        message.what = 3;
                        handler.sendMessage(message);*/
                    }else{
                        throw new IOException("Unexpected code " + response);
                    }
                }catch (MalformedURLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
   }

上面的代码里面,运行起来就是如上的效果,打印出来的数据是正常,但是到了解析这里就出现问题了。提示没有数据,

com.alibaba.fastjson.JSONException: syntax error, expect {, actual error, pos 0!
还有一种情况就是提示数据流被关闭了:java.lang.IllegalStateException: closed  ;

两个原因都是The IllegalStateException arises because the HttpConnection seems to be closed when trying to use it. Could it be because you are calling twice the method response.body()?就是说调用response.body().string()的时候数据流已经关闭了,再次调用就是提示已经closed,或者没有数据送到解析处。

我们在调试的时候喜欢Log一下看看数据正不正常,我在使用HttpURLConnection  或者 HttpClient 获取Response时都是先Log看看然后再传输给其他函数去解析,没有出现这样的问题;但是在使用OKhttp时就不正常了,因为调用了一次response.body().string(),那么这个流就已经被关闭了。所以想要Log,又要解析的时候,解决的办法

暂存一下这个数据:String tempResponse =  response.body().string();然后使用这个暂存的数据tempResponse 。 

验证:一切正常了:



希望能帮到类似问题的朋友。

参考帖子: http://www.cnblogs.com/boann/p/5479201.html


评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值