需求
遇到了个非常奇葩的问题才导致这个功能诞生的。一个项目里需要轮询一个接口,接口会给出消息,根据消息判断请求另一个接口后增加本地数据,结果服务端一次性给过来多条相同的消息导致本地异步执行了多次的更新数据接口导致本地数据重复。
另外日常开发组也经常遇到例如用户手抖导致多次请求的情况,那么实际上此问题是可以在框架层直接拦截处理的。
解决方案
每次请求的 URL 地址和参数都一致的情况,开启拦截选项后,同一请求地址同一请求参数的请求,在一个请求未结束前,将不允许再次请求逻辑。
BaseOkHttpV3下一版增加禁止重复请求功能,从原理上你再也不用担心用户手抖多按几次按钮的问题了。
在新版本 BaseOkHttpV3 中,需要先开启禁止重复请求的开关:
BaseOkHttp.disallowSameRequest = true;
原理
在 BaseOkHttp.java 中增加了一个存储队列:
static List requestInfoList;
每次发出一个新的请求后,会添加至此队列:
addRequestInfo(new RequestInfo(url, parameter));
而再次请求时,则会进行判断,若队列中存在此请求则会拦截:
if (disallowSameRequest && equalsRequestInfo(requestInfo)) {
//发生重复请求
return;
}
而当请求完成,请求失败,超时等,则会从队列清除。
若有特殊情况额外需要多次快速建立请求的场景,可以按需求关闭此选项或在参数中添加时间戳以避免被当做重复请求。
使用
若正在使用 BaseOkHttpV3 框架,可更新至 3.1.9.5 测试版本:
//BaseOkHttp V3 网络请求库
implementation 'com.kongzue.baseokhttp_v3:baseokhttp_v3:3.1.9.5'
//BaseJson 解析库
implementation 'com.kongzue.basejson:basejson:1.0.5'