解決
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)致的異常。文章來源:http://www.zghlxwxcb.cn/news/detail-657308.html
請注意,這只是解決java.lang.IllegalStateException: closed
異常的一種方式。確保在其他地方?jīng)]有關(guān)閉Response
對象,以免引發(fā)其他類似的異常。
重要代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-657308.html
String responseBody = response.body().string(); // 緩存響應(yīng)體內(nèi)容
到了這里,關(guān)于【Android】okhttp爆java.lang.IllegalStateException: closed的解決方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!