[本文未经许可,不可转载或其他形式的分享 ]
Android 开发中网络请求很多都会用Retrofit,面试过程发现很多只会用不去了解http基础原理,不打牢基础,遇到问题不能很好的解决,在开发中经常遇到重复http请求,也就是一个请求还没有返回相同的请求又发出了,不但会让客户端体验不好还可能导致服务器压力过大。
解决方法
- 1.如果只是用户重复点击按钮导致的也可以简单的disable 按钮或者限制高频点击
- 2.上面的场景只要退出页面再进入一次就失效了或者业务太复杂就会导致重复请求
Anyway,我们就是想要一种方法要全局的拦截HTTP 的请求,重复的请求就不要再请求了。
其实以前使用AsyncHttp 的时候全局拦截重复http请求还是很简单的。那么Retrofit 也是一样的原理,可能大家不熟悉。
1.首先要确定一个http请求是否是相同的,根据请求的方法,path和参数等确定并生成一个KEY
2.使用一个全局的MAP 保存请求的map.add(key),假如Map 中不存在。否则就是存在要忽略,并返回一个无效的Response。
3.等http请求返回后Map.Remove(key)
下面看看部分代码
- 添加记录请求或者忽略
String requestKey = MD5Util.getUpperMD5Str(Request.toString());
if (null == requestIdsMap.get(requestKey)) {
requestIdsMap.put(requestKey, System.currentTimeMillis());
} else {
//自定义的一个错误Response ,哈哈哈这个操作很骚
return new Response.Builder()
.xxxx
.yyyy
.build();
}
2.在拦截器里面拦截请求,并取消map中的http请求标记
requestIdsMap.remove(requestKey);
就是这么Easy, Retrofit的设计实在是巧妙,添加各种骚操作也是很简单
Demo:https://github.com/AnyLifeZLB/MVP-Dagger2-Rxjava2
代码在Demo中需要自己找,搜索关键字requestIdsMap。From Felix