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 ( 配置依赖 | 配置 ...
最新文章
- 首例利用智能路由网关犯罪嫌疑人被捕:罪名流量劫持
- 未能添加对***.dll的引用 问题解决方法
- 人脸识别入侵生活,但“刷脸”背后你的信息安全吗?
- spring 发送html邮件,Springboot2.0 发送HTML 格式的邮件。
- linux shell less 命令---转
- kafka0.8消费者实例
- C#函数式编程之序列
- 试验一下纯手写blog
- 安装nagios中php安装报错 configure error xml2-config not foud
- Twisted入门教程(6)
- 编程语言的发展趋势及未来方向 目录 编程语言的发展趋势及未来方向	1 第一章 一、历史回顾及趋势概述	2 第一节 首先,编程语言的发展非常缓慢。oo等等,但是远没有好上1000倍。	3 第二节 出现
- oracle sql计算百分比,Oracle sql百分比问题 - oracle 使用笔记
- Excel表格中如何换行
- 怎么删除远程桌面连接计算机,win10系统强制删除远程桌面连接软件的方法
- 人脸活体检测:活体检测数据集
- python和scre_python中变量命名的基本规则,标识符和关键字
- Web大学生网页作业成品:基于html制作中国科技发展网站设计题材【航天之路7页】HTML+CSS+JavaScript
- [SDOI2009]学校食堂
- 在Centos 7 上 搭建 K8S --坑b)
- argparse用于解析命令行参数
热门文章
- 【NOI2011】兔兔与蛋蛋的游戏【二分图博弈】
- 【每日一题】8月6日题目精讲—追债之旅
- [POJ 3164]Command Network(最小树形图,朱刘算法)
- P2168 [NOI2015] 荷马史诗(哈夫曼编码树)
- P3172-[CQOI2015]选数【dp,容斥】
- hdu5709-Claris Loves Painting【线段树合并】
- ssl提高组周六模拟赛【2019.3.2】
- NOIP2018-普及总结
- ssl提高组周一备考赛【2018.10.29】
- ssl2344P2835-刻录光盘【Floyd,联通块数,图论】