Retrofit2的一些坑

现在都在说Retrofit2和RxJava2,作为一个程序猿自然不能落伍,然后就试用了一下,遇到一些坑,在这里记录一下

1.

io.reactivex.exceptions.OnErrorNotImplementedException: closed

Caused by: java.lang.IllegalStateException: closed

这两个异常今天研究了好几个小时... 网上都是说Response.body().string()方法不能调用2次,但是在我的代码里这个方法并没有调用2次,一个Response的ResponseBody属性我只调用了1次string()方法,后来终于发现,在我的判断里有不同的流程,其中一个流程就没有问题,然后发现流程A的Response我直接return了,但是流程B的Response我调用了它的body().string()方法,我判断了里面的返回结果字符串,发现如果没有错误就把这个流程B的Response对象return了,但是!!! 因为我return的这个Response已经被我调用过body().string()方法了,Retrofit2把结果返回上层应用的时候,在convert的时候(因为retrofit调用了addConverterFactory方法)就出错了,因为这个Response的ResponseBody属性已经close了,所以在返回的时候,需要一个新的Response,并设置其中的body为新的body,代码如下:

Response response = chain.proceed(newRequest);//执行新请求
String responseString = response.body().string();
//对responseString...执行一些判断之类的操作
return response.newBuilder().body(ResponseBody.create(response.body().contentType(), responseString)).build();

注意:

1.上面的这个问题,如果你添加了自己的log拦截器,在你的log拦截器里如果调用了Response的body属性的string()方法,那么返回的response对象你也要这么处理,否则在其他类里时候的时候,虽然response不是一个对象,但是里面的body是同一个对象(不信的可以debug查看log拦截器里面你返回的response的body属性内存地址和其他拦截器里同请求的这个response的body属性的内存地址),然后其他类调用response.body().string()的时候会报close错误,所以只要用到了response.body().string()方法,在返回这个response的时候就要像上面那样返回才可以避免close问题

2.如果不是string()方法,你用的是response.body().bytes()方法再转字符串是一样的,在方法内部都close了,所以仍然需要像上面那样处理

2.

Caused by: java.lang.IllegalStateException: network interceptor xxx must call proceed() exactly once

io.reactivex.exceptions.OnErrorNotImplementedException: network interceptor xxx must call proceed() exactly once

这是因为你的OkHttpClient.Builder调用的addNetworkInterceptor方法添加的拦截器,这种方式添加的拦截器里面的Chain只能调用一次proceed方法,如果想调用多次,你的拦截器就要用addInterceptor方法添加,就没问题了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,886评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,759评论 18 399
  • 这篇文章主要讲 Android 网络请求时所使用到的各个请求库的关系,以及 OkHttp3 的介绍。(如理解有误,...
    小庄bb阅读 1,213评论 0 4
  • 家家都有难念的经 政治婚姻是什么鬼 你有机会接触更好的 但你却不能 不能不是不能 是不想 为什么不想 就只因为执念...
    星星的眼睛y阅读 469评论 0 0
  • 我喜欢写作,好像是很小就开始了。 我是家里的老大,三个弟弟。父母都是搞专业技术工作的,每天上班忙,经常是:我们几姐...
    林泉雲霞阅读 368评论 1 1