android 处理http状态码,OkHttp(Retrofit)对于http状态码202的处理
http code 202 :
The request has been accepted for processing, but the processing has not been completed.
这时候,服务器给你的body是空的,如果你使用去解析为json,那么,恭喜你
java.io.EOFException: End of input at line 1 column 1 在前面等着你
一个比较好的理解就是,服务器接受了你的请求,但是现在来不及处理,需要你等会试试。对于这种状态码,OkHttp并没有为我们处理,jake大神也回答如是:
Paste_Image.png
这个issue在这里:
https://github.com/square/retrofit/issues/1554
我个人的解决办法是如此:
写一个拦截器,拦截这种202的状态码.
然后我们本身又使用的rxjava这个强大的框架去配合Retrofit,这时候,我遇到这种状态吗的是时候,去重试即可,具体的拦截器如下:
public class CreateInterceptor implements Interceptor {
public static final int HTTP_CODE_ACCEPT = 202; //请求成功,但没有处理
@Override
public Response intercept(Chain chain) throws IOException {
Response response = chain.proceed(chain.request()); //如果401了,会先执行TokenAuthenticator
Logger.e("CreateInterceptor request url "+response.request().url());
Logger.e("CreateInterceptor response code "+response.code());
if (response.code() == HTTP_CODE_ACCEPT) {
CreateInterceptorExceptioin interceptorExceptioin = new CreateInterceptorExceptioin();
interceptorExceptioin.setErrorCode(HTTP_CODE_ACCEPT);
interceptorExceptioin.setRetry_after(response.header("Retry-After"));
throw interceptorExceptioin;
}
return response;
}
public class CreateInterceptorExceptioin extends Error{
private int errorCode;
private String retry_after;
public int getErrorCode() {
return errorCode;
}
public void setErrorCode(int errorCode) {
this.errorCode = errorCode;
}
public String getRetry_after() {
return retry_after;
}
public void setRetry_after(String retry_after) {
this.retry_after = retry_after;
}
}
}
然后,在build的时候
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.addInterceptor(new CreateInterceptor());//拦截202,直接返回错误哦
OkHttpClient okHttpClient = builder.build();
再将上述 build出来的OkHttpClient 设置给 Retrofit 即可。
new Retrofit.Builder().client(....)...
那么,最最重要的,如何去重试呢?
实际上,我也是参考了网上的一个例子 ,在我的另外一篇文章中有提到这个技巧:android中使用Rxjava一些有意思的代码集合 ,在第17条那里,参照这个原理,略微改了改,这里的代码如下:
public static final class RetryWhen202Happen implements Func1, Observable>> {
private final int _maxRetries;
private final int _retryDelayMillis;
private int _retryCount;
public RetryWhen202Happen(final int maxRetries, final int retryDelayMillis) {
_maxRetries = maxRetries;
_retryDelayMillis = retryDelayMillis;
_retryCount = 0;
}
@Override
public Observable> call(Observable extends Throwable> inputObservable) {
return inputObservable.flatMap(new Func1>() {
@Override
public Observable> call(Throwable throwable) {
if (++_retryCount < _maxRetries && throwable instanceof CreateInterceptor.CreateInterceptorExceptioin) {
// When this Observable calls onNext, the original
// Observable will be retried (i.e. re-subscribed)
Log.e("RetryWhen202Happen", "call: "+_retryCount);
return Observable.timer(_retryCount * _retryDelayMillis, TimeUnit.MILLISECONDS);
}
return Observable.error(throwable);
}
});
}
}
最后:我们使用rxjava提供的retryWhen即可。
retryWhen.png
android 处理http状态码,OkHttp(Retrofit)对于http状态码202的处理相关推荐
- Android:手把手带你深入剖析 Retrofit 2.0 源码
前言 在Andrroid开发中,网络请求十分常用 而在Android网络请求库中,Retrofit是当下最热的一个网络请求库 今天,我将手把手带你深入剖析Retrofit v2.0的源码,希望你们会喜 ...
- Android Kotlin okhttp Retrofit 线程协程那些事
这篇文章不是用来讲概念的, 只是用来谈论一些关于Android 进程\协程那些问题 1. android 子线程中的异常会引发crash闪退吗? 答案是会的 Thread{throw RuntimeE ...
- Android OkHttp+Retrofit+Rxjava+Hilt 的网络请求封装
今天给大家简单的封装一个现在比较流行的网络请求框架 第一步是导入我们所需要的依赖还需要在android {}闭包下添加一个 buildFeatures{viewBinding true } imple ...
- android网络请求撤销,Android OkHttp + Retrofit 取消请求的方法
前言 在某一个界面,用户发起了一个网络请求,因为某种原因用户在网络请求完成前离开了当前界面,比较好的做法是取消这个网络请求.对于OkHttp来说,具体是调用Call的cancel方法. 如何找到这一个 ...
- Android系统(126)---OKHTTP
安卓开发领域,很多重要的问题都有了很好的开源解决方案,例如网络请求 OkHttp + Retrofit 简直就是不二之选."我们不重复造轮子不表示我们不需要知道轮子该怎么造及如何更好的造!& ...
- 作为Android开发师,你真的懂怎么读源码吗?
前言 对于许多Android开发者来说,所谓的Android工程师的工作"不过就是用XML实现设计师的美术图,用JSON解析服务器的数据,再把数据显示到界面上"就好了,源码什么的, ...
- 一行代码实现Okhttp,Retrofit,Glide下载上传进度监听
2019独角兽企业重金招聘Python工程师标准>>> 发表上篇文章 我一行代码都不写实现Toolbar!你却还在封装BaseActivity? 已是一个月前的事情~ 上篇文章的研究 ...
- Android 源码分析之 EventBus 的源码解析
1.EventBus 的使用 1.1 EventBus 简介 EventBus 是一款用于 Android 的事件发布-订阅总线,由 GreenRobot 开发,Gihub 地址是:EventBus. ...
- 【OkHttp】OkHttp 源码分析 ( OkHttpClient.Builder 构造器源码分析 )
OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...
最新文章
- 1.spring boot要求最低jdk1.8,平安默认1.6问题,-》安装JDK1.8 2.maven 3.3.3要求最低jdk1.7-安装jdk 1.8...
- C语言函数strstr()分析及实现
- 平安保险基于 SPI 机制的 RocketMQ 定制化应用
- zookeeper3.4.6安装
- Unity手游开发札记——移动平台的天气系统实现
- ubuntu mysql混合开发_mysql5.7主从同步 ubuntu
- js字符串转数字(小数),数字转字符串
- 14 SD配置-企业结构-分配-分配销售组织-分销渠道-工厂
- 【spark系列3】spark开发简单指南
- 无意间发现BAT大佬总结的一份目标检测、卷积神经网络和OpenCV学习资料(教程/PPT/代码)...
- htonl() htons()及inet_ntoa() inet_addr()的用法
- 【吾日三省吾身】2015.6.07-涅槃行动第二十天
- 【机器学习系列】EM算法第三讲:由Jensen Inequality推导EM算法
- redis入门(转)
- lopatkin俄大神Windows精简版系统 安装教程 简单版
- 第3-2课:用三个水桶等分 8 升水的问题
- python实战笔记之(4):刷博客浏览量
- 如何用人工智能自动玩游戏
- linux打开db文件,我如何打开. db 文件?
- jsp四大作用域介绍
热门文章
- ubuntu 文件管理器死机
- GBK、GB2312、GB18030
- 多项式牛顿迭代(应用:求逆,开根,对数exp)
- 2021HDU多校第九场1008HDU7073 Integers Have Friends 2. 随机化
- LOJ#2542. 「PKUWC2018」随机游走
- YBTOJ:采矿战略(线段树维护dp、树链剖分)
- YBTOJ洛谷P2223:软件开发(费用流)
- jzoj3337-[NOI2013模拟]wyl8899的TLE【字符串hash,二分】
- P3365,jzoj3894-改造二叉树【LIS,BST】
- nssl1150,jzoj5309-密室【分层建图,SPFA】