1. 程式人生 > >Android -- 使用OKhttp獲取response時遇到的坑

Android -- 使用OKhttp獲取response時遇到的坑

最近在使用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 。 

驗證:一切正常了:


希望能幫到類似問題的朋友。