【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(); // 缓存响应体内容
相关推荐
人道领域1 分钟前
Day | 09 【苍穹外卖:订单售后业务】
java·数据库·后端
码农的小菜园9 分钟前
Java线程池学习笔记
java·笔记·学习
hongtianzai23 分钟前
Laravel8.x核心特性全解析
java·c语言·开发语言·golang·php
逸Y 仙X27 分钟前
文章十一:ElasticSearch Dynamic Template详解
java·大数据·数据库·elasticsearch·搜索引擎·全文检索
隔壁小邓28 分钟前
IDEA 中同时启动多个微服务
java·微服务·intellij-idea
:12129 分钟前
idea17创建tomcat项目(计网底层核心理解!)
java·ide·intellij-idea
Brookty32 分钟前
网络通信核心:四元组、socket与IO机制详解
java·网络通信·网络入门
qq_2837200538 分钟前
MySQL技巧(三):慢查询开启与分析优化案例
android·adb
常利兵39 分钟前
从Groovy到KTS:Android Gradle脚本的华丽转身
android
穷人小水滴40 分钟前
使用 WebRTC 实现局域网投屏: PC (GNOME ArchLinux) -> 平板 (Android)
android·linux·webrtc·浏览器·js·gnome·投屏