在程序中进行网络操作时,有时会遇到网络连接失败或者登录过期需要重新登录的操作。之前的做法是在每次进行网络连接的时候都判断一下网络连接状态和是否需要重新登录,并且每次都要写相同的代码来处理这些情况。于是考虑将网络连接操作做一个封装,把所有检查网络连接状态和是否需要重新登录的操作统一处理,只处理请求成功的结果。
以下是自定义的CallBack:
public abstract class MyCallBack<T> implements Callback<T> {
@Override
public void onResponse(Call<T> call, Response<T> response) {
if (response.body() == null) {
onFail();
Toast.makeText(MyApplication.getContext(), "未获取到数据,请稍后再试", Toast.LENGTH_SHORT).show();
return;
}
BaseResp<T> baseResp = (BaseResp<T>) response.body();
switch (baseResp.getStatus_code()) {
case Constant.REDIS_ERROR://redis服务器故障
onFail();
NetworkUtil.submitServerError();//向服务器报告
break;
case Constant.SERVER_ERROR://服务器故障
onFail();
NetworkUtil.submitServerError();
break;
case Constant.TOKEN_EXPIRED://登陆过期
//获取新的登录token
TokenUtil.reset(new TokenUtil.ResetFinish() {
@Override
public void resetFinish() {
requestAgain();
}
});
break;
default:
onSuc(response);
break;
}
}
@Override
public void onFailure(Call<T> call, Throwable t) {
onFail();
NetworkUtil.submitRequestFailure();
}
//请求成功
public abstract void onSuc(Response<T> response);
//需要重新进行网络连接
public abstract void requestAgain();
//请求失败
public abstract void onFail();
}
其中BaseResp为:
public class BaseResp<T> {
private T data;
private String status_code; //status_code=200表示网络请求正常,其余情况表示网络连接不正常
private String message;
...//get set方法
}
使用:
call.enqueue(new MyCallBack<BaseResp<InitResp>>() {
@Override
public void onSuc(Response<BaseResp<InitResp>> response) {
}
@Override
public void requestAgain() {
}
@Override
public void onFail() {
}
});