不用編程做APP和響應式網站百度手機助手下載安卓版
解決
java.lang.IllegalStateException: closed
異常通常是由于OkHttp中的Response
對象在調用response.body().string()
后被關閉而導致的。
在代碼中,在onResponse()
方法中如果兩次調用了response.body().string()
,每次調用都會消耗掉響應體并關閉Response
對象。因此,當第二次調用response.body().string()
時,就會拋出java.lang.IllegalStateException: closed
異常。
為了解決這個問題,可以將響應體的內容緩存起來,然后多次使用。下面是修改后的代碼示例:
public void onResponse(Call call, Response response) throws IOException {String responseBody = response.body().string(); // 緩存響應體內容if (!response.isSuccessful()) {callback.onComponentInitFinish(COMPONENT_TOKEN, ERROR_GET_TOKEN_FAIL, "獲取token失敗");} else {TokenInfoBean tokenInfoBean = mGson.fromJson(responseBody, TokenInfoBean.class);if (tokenInfoBean != null && tokenInfoBean.ret != null) {APIBase.okHandler.post(new Runnable() {public void run() {KeyCenterCheckHelp.checkAndToast(tokenInfoBean.ret.code, tokenInfoBean.ret.message);}});}if (tokenInfoBean != null && tokenInfoBean.data != null) {savedToken = tokenInfoBean.data.token;tokenStartStamp = System.currentTimeMillis();tokenExpiredStamp = tokenStartStamp + tokenInfoBean.data.duration * 1000;callback.onComponentInitFinish(COMPONENT_TOKEN, 0, "");} else {callback.onComponentInitFinish(COMPONENT_TOKEN, tokenInfoBean.ret.code, tokenInfoBean.ret.message);}}
}
在修改后的代碼中,我們將response.body().string()
的結果緩存在responseBody
變量中,并在后續(xù)的邏輯中多次使用。這樣就避免了多次調用導致的異常。
請注意,這只是解決java.lang.IllegalStateException: closed
異常的一種方式。確保在其他地方沒有關閉Response
對象,以免引發(fā)其他類似的異常。
重要代碼:
String responseBody = response.body().string(); // 緩存響應體內容