【Android】okhttp爆java.lang.IllegalStateException: closed的解决方法

解决

java.lang.IllegalStateException: closed异常通常是由于OkHttp中的Response对象在调用response.body().string()后被关闭而导致的。

在代码中,在onResponse()方法中如果两次调用了response.body().string(),每次调用都会消耗掉响应体并关闭Response对象。因此,当第二次调用response.body().string()时,就会抛出java.lang.IllegalStateException: closed异常。

为了解决这个问题,可以将响应体的内容缓存起来,然后多次使用。下面是修改后的代码示例:

java 复制代码
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变量中,并在后续的逻辑中多次使用。这样就避免了多次调用导致的异常。

请注意,这只是解决java.lang.IllegalStateException: closed异常的一种方式。确保在其他地方没有关闭Response对象,以免引发其他类似的异常。

重要代码:

java 复制代码
	  String responseBody = response.body().string(); // 缓存响应体内容
相关推荐
mldong4 小时前
一个 App,十三套后端:手机审批端 uni-jeeflow-app 开源了
java·架构
157092511345 小时前
Android进阶之光:HTTP协议原理深度解析
android·网络协议·http
tqs_123455 小时前
MySQL RR隔离级别死锁|Gap间隙锁、临键锁,订单并发范围查询死锁根因方案
java
终端安全笔记5 小时前
安卓五品牌通道差在哪:监管通道拆解
android
逆境不可逃5 小时前
Pi Agent 学习笔记:多个工具怎样并行执行
java
v_34836087626 小时前
Android native端 堆栈打印
android·算法
Flynt6 小时前
Java 27 升级实测:默认值动得比新特性多,有个老参数会让 JVM 直接起不来
java·jvm·后端
Bs_MoneyMagnet6 小时前
基于springboot+vue的个人健康管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·vue3·springboot3·计算机毕业设计
一笑的小酒馆6 小时前
AndroidKMP之导航和WebView
android
星云API技术支持7 小时前
企业微信二次开发:群权限设置、成员管理与群资料维护的接口组合实践
java·前端·企业微信