版权声明:本文为代码部落原创文章,转载请注明出处。
前言
前段时间项目中碰到一个将请求分页的任务。是将一个网络请求分成N次来完成,最终总量不变,以此减轻服务器的压力。考虑到有多条协议都要做分页,因此考虑整理出一个统一规范简单的分页请求框架。
结构设计
因为打算整理成统一的工具,因此我们必须将分页流程与业务逻辑分开。我们的代码里只统一管理整个分页请求的过程,对如何请求,是否还有下一页请求暂不处理,这部分业务逻辑让调用者根据需要去具体实现。
定义接口
思考一下。这个分页请求的我们应该定义出一些必要的操作。初始化,网络请求,判断是否继续,是否成功等等。我画了一张流程图如下:
因此我们抽象出一些必要的接口:
Java
public interface ReqPagingListener {
/**
* 是否还有下一页请求
*/
boolean hasNext();
/**
* 发起请求
* @param index 当前请求的次数
*/
void onRequest(int index, SimpleCallBack callBack);
/**
* 初始化
*/
void onInit();
/**
* 所有任务请求完成
*/
void onFinish();
/**
* 请求失败
*/
void onFail();
}
/**
* 简单无数据回调
*/
public interface SimpleCallBack {
void onSuccess();
void onFail();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
publicinterfaceReqPagingListener{
/**
* 是否还有下一页请求
*/
booleanhasNext();
/**
* 发起请求
* @param index 当前请求的次数
*/
voidonRequest(intindex,SimpleCallBackcallBack);
/**
* 初始化
*/
voidonInit();
/**
* 所有任务请求完成
*/
voidonFinish();
/**
* 请求失败
*/
voidonFail();
}
/**
* 简单无数据回调
*/
publicinterfaceSimpleCallBack{
voidonSuccess();
voidonFail();
}
实现分页逻辑
分页请求的逻辑,我们可以看成是一个迭代的过程:
Java
/**
* 发起请求
*/
private void request() {
//如果当前页请求次数未达到最多重试次数
if (mReqIndex < FAIL_AGAIN_TIME) {
//还有下一页数据,继续
if (mListener.hasNext()) {
mListener.onRequest(mReqTime++, new SimpleCallBack() {
@Override
public void onSuccess() {
mReqIndex = 0;
request();
}
@Override
public void onFail() {
//当前请求失败,重试
mReqIndex++;
mReqTime--;
request();
}
});
} else {
//没有下一页数据,请求结束
mListener.onFinish();
}
} else {
//超过定义的最多重试次数,失败
mListener.onFail();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
* 发起请求
*/
privatevoidrequest(){
//如果当前页请求次数未达到最多重试次数
if(mReqIndex
//还有下一页数据,继续
if(mListener.hasNext()){
mListener.onRequest(mReqTime++,newSimpleCallBack(){
@Override
publicvoidonSuccess(){
mReqIndex=0;
request();
}
@Override
publicvoidonFail(){
//当前请求失败,重试
mReqIndex++;
mReqTime--;
request();
}
});
}else{
//没有下一页数据,请求结束
mListener.onFinish();
}
}else{
//超过定义的最多重试次数,失败
mListener.onFail();
}
}
提供一个公共的方法给外部调用者调用:
Java
/**
* 开始任务
*/
public void startTask() {
if (mListener == null) {
throw new RuntimeException("You must register a listener!");
}
mListener.onInit();
mReqIndex = 0;//第N次请求索引
mReqTime = 0;//当前页请求次数
request();//发起请求
}
1
2
3
4
5
6
7
8
9
10
11
12
/**
* 开始任务
*/
publicvoidstartTask(){
if(mListener==null){
thrownewRuntimeException("You must register a listener!");
}
mListener.onInit();
mReqIndex=0;//第N次请求索引
mReqTime=0;//当前页请求次数
request();//发起请求
}
使用也十分方便:
Java
ReqPagingUtils pagingUtils = new ReqPagingUtils();
pagingUtils.setListener(new ReqPagingUtils.ReqPagingListener() {
@Override
public boolean hasNext() {
//TODO 下一次请求会根据这里的返回值决定是否继续
return false;
}
@Override
public void onRequest(int index, SimpleCallBack callBack) {
//TODO 这里写上网络请求,成功时调用callBack的onSuccess()方法,失败时调用onFail()
}
@Override
public void onInit() {
//TODO 这里写上需要初始化的代码
}
@Override
public void onFinish() {
//TODO 所有请求完成时,回调这个方法
}
@Override
public void onFail() {
//TODO 请求失败时,回调这个方法
}
});
//开始任务
pagingUtils.startTask();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
ReqPagingUtilspagingUtils=newReqPagingUtils();
pagingUtils.setListener(newReqPagingUtils.ReqPagingListener(){
@Override
publicbooleanhasNext(){
//TODO 下一次请求会根据这里的返回值决定是否继续
returnfalse;
}
@Override
publicvoidonRequest(intindex,SimpleCallBackcallBack){
//TODO 这里写上网络请求,成功时调用callBack的onSuccess()方法,失败时调用onFail()
}
@Override
publicvoidonInit(){
//TODO 这里写上需要初始化的代码
}
@Override
publicvoidonFinish(){
//TODO 所有请求完成时,回调这个方法
}
@Override
publicvoidonFail(){
//TODO 请求失败时,回调这个方法
}
});
//开始任务
pagingUtils.startTask();
完整代码
完整代码如下。可以根据具体需要修改,拓展。
Java
public class ReqPagingUtils {
private ReqPagingListener mListener;
private static final int FAIL_AGAIN_TIME = 3; //失败重发--限制请求次数
private int mReqIndex;//当前请求次数
private int mReqTime;//总第N次请求
public void setListener(ReqPagingListener listener) {
this.mListener = listener;
}
/**
* 开始任务
*/
public void startTask() {
if (mListener == null) {
throw new RuntimeException("You must register a listener!");
}
mListener.onInit();
mReqIndex = 0;//第N次请求索引
mReqTime = 0;//当前页请求次数
request();//发起请求
}
/**
* 发起请求
*/
private void request() {
//如果当前页请求次数未达到最多重试次数
if (mReqIndex < FAIL_AGAIN_TIME) {
//还有下一页数据,继续
if (mListener.hasNext()) {
mListener.onRequest(mReqTime++, new SimpleCallBack() {
@Override
public void onSuccess() {
mReqIndex = 0;
request();
}
@Override
public void onFail() {
//当前请求失败,重试
mReqIndex++;
mReqTime--;
request();
}
});
} else {
//没有下一页数据,请求结束
mListener.onFinish();
}
} else {
//超过定义的最多重试次数,失败
mListener.onFail();
}
}
/**
* 返回当前成功请求的索引
*/
public int getRequestTime() {
return mReqTime;
}
public interface ReqPagingListener {
/**
* 是否还有下一页请求
*/
boolean hasNext();
/**
* 发起请求
*
* @param index 当前请求的次数
*/
void onRequest(int index, SimpleCallBack callBack);
/**
* 初始化
*/
void onInit();
/**
* 所有任务请求完成
*/
void onFinish();
/**
* 请求失败
*/
void onFail();
}
public interface SimpleCallBack {
void onSuccess();
void onFail();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
publicclassReqPagingUtils{
privateReqPagingListenermListener;
privatestaticfinalintFAIL_AGAIN_TIME=3;//失败重发--限制请求次数
privateintmReqIndex;//当前请求次数
privateintmReqTime;//总第N次请求
publicvoidsetListener(ReqPagingListenerlistener){
this.mListener=listener;
}
/**
* 开始任务
*/
publicvoidstartTask(){
if(mListener==null){
thrownewRuntimeException("You must register a listener!");
}
mListener.onInit();
mReqIndex=0;//第N次请求索引
mReqTime=0;//当前页请求次数
request();//发起请求
}
/**
* 发起请求
*/
privatevoidrequest(){
//如果当前页请求次数未达到最多重试次数
if(mReqIndex
//还有下一页数据,继续
if(mListener.hasNext()){
mListener.onRequest(mReqTime++,newSimpleCallBack(){
@Override
publicvoidonSuccess(){
mReqIndex=0;
request();
}
@Override
publicvoidonFail(){
//当前请求失败,重试
mReqIndex++;
mReqTime--;
request();
}
});
}else{
//没有下一页数据,请求结束
mListener.onFinish();
}
}else{
//超过定义的最多重试次数,失败
mListener.onFail();
}
}
/**
* 返回当前成功请求的索引
*/
publicintgetRequestTime(){
returnmReqTime;
}
publicinterfaceReqPagingListener{
/**
* 是否还有下一页请求
*/
booleanhasNext();
/**
* 发起请求
*
* @param index 当前请求的次数
*/
voidonRequest(intindex,SimpleCallBackcallBack);
/**
* 初始化
*/
voidonInit();
/**
* 所有任务请求完成
*/
voidonFinish();
/**
* 请求失败
*/
voidonFail();
}
publicinterfaceSimpleCallBack{
voidonSuccess();
voidonFail();
}
}
更多推荐
java分页框架_Java简单分页请求框架
发布评论