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 =
驗證:一切正常了:
希望能幫到類似問題的朋友。