国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

OkHttp踩坑隨筆為何 response.body().string() 只能調用一次

2024-05-06 15:22:48
字體:
來源:轉載
供稿:網友

想必大家都用過或接觸過 OkHttp,我最近在使用 Okhttp 時,就踩到一個坑,在這兒分享出來,以后大家遇到類似問題時就可以繞過去。

只是解決問題是不夠的,本文將 側重從源碼角度分析下問題的根本,干貨滿滿。

1.發現問題

在開發時,我通過構造 OkHttpClient 對象發起一次請求并加入隊列,待服務端響應后,回調  Callback 接口觸發  onResponse() 方法,然后在該方法中通過  Response 對象處理返回結果、實現業務邏輯。代碼大致如下:

//注:為聚焦問題,刪除了無關代碼getHttpClient().newCall(request).enqueue(new Callback() {  @Override  public void onFailure(Call call, IOException e) {}  @Override  public void onResponse(Call call, Response response) throws IOException {    if (BuildConfig.DEBUG) {      Log.d(TAG, "onResponse: " + response.body().toString());    }    //解析請求體    parseResponseStr(response.body().string());  }});

在 onResponse() 中,為便于調試,我打印了返回體,然后通過  parseResponseStr() 方法解析返回體(注意:這兒兩次調用了  response.body().string() )。

這段看起來沒有任何問題的代碼,實際運行后卻出了問題:通過控制臺看到成功打印了返回體數據(json),但緊接著拋出了異常:

java.lang.IllegalStateException: closed

2.解決問題

檢查代碼后,發現問題出在調用 parseResponseStr() 時,再次使用了  response.body().string() 作為參數。由于當時趕時間,上網查閱后發現  response.body().string() 只能調用一次,于是修改  onResponse() 方法中的邏輯后解決了問題:

getHttpClient().newCall(request).enqueue(new Callback() {  @Override  public void onFailure(Call call, IOException e) {}  @Override  public void onResponse(Call call, Response response) throws IOException {    //此處,先將響應體保存到內存中    String responseStr = response.body().string();    if (BuildConfig.DEBUG) {      Log.d(TAG, "onResponse: " + responseStr);    }    //解析請求體    parseReponseStr(responseStr);  }});

3.結合源碼分析問題

問題解決了,事后還是要分析的。由于之前對 OkHttp 的了解僅限于使用,沒有仔細分析過其內部實現的細節,周末抽時間往下看了看,算是弄明白了問題發生的原因。

先分析最直觀的問題:為何 response.body().string() 只能調用一次?

拆解來看,先通過 response.body() 得到  ResponseBody 對象(其是一個抽象類,在此我們不需要關心具體的實現類),然后調用  ResponseBody 的  string() 方法得到響應體的內容。

分析后 body() 方法沒有問題,我們往下看  string() 方法:

public final String string() throws IOException { return new String(bytes(), charset().name());}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 新营市| 蒲城县| 重庆市| 叶城县| 岳池县| 肃北| 江达县| 龙游县| 三台县| 岳普湖县| 光山县| 浦北县| 海口市| 枣阳市| 会同县| 苏尼特左旗| 沁水县| 陕西省| 全南县| 枝江市| 璧山县| 兴安县| 横山县| 南昌县| 申扎县| 苗栗县| 乐安县| 成都市| 剑河县| 遂宁市| 菏泽市| 邳州市| 阳高县| 塔河县| 攀枝花市| 清徐县| 鄱阳县| 荥经县| 司法| 凌海市| 郑州市|