不用編程做APP和響應(yīng)式網(wǎng)站百度手機助手下載安卓版
解決
java.lang.IllegalStateException: closed
異常通常是由于OkHttp中的Response
對象在調(diào)用response.body().string()
后被關(guān)閉而導(dǎo)致的。
在代碼中,在onResponse()
方法中如果兩次調(diào)用了response.body().string()
,每次調(diào)用都會消耗掉響應(yīng)體并關(guān)閉Response
對象。因此,當(dāng)?shù)诙握{(diào)用response.body().string()
時,就會拋出java.lang.IllegalStateException: closed
異常。
為了解決這個問題,可以將響應(yīng)體的內(nèi)容緩存起來,然后多次使用。下面是修改后的代碼示例:
public void onResponse(Call call, Response response) throws IOException {String responseBody = response.body().string(); // 緩存響應(yīng)體內(nèi)容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()
的結(jié)果緩存在responseBody
變量中,并在后續(xù)的邏輯中多次使用。這樣就避免了多次調(diào)用導(dǎo)致的異常。
請注意,這只是解決java.lang.IllegalStateException: closed
異常的一種方式。確保在其他地方?jīng)]有關(guān)閉Response
對象,以免引發(fā)其他類似的異常。
重要代碼:
String responseBody = response.body().string(); // 緩存響應(yīng)體內(nèi)容