烦恼一般都是想太多了。

0%

Retrofit统一进行错误处理的实现

在前的一篇文章中 建立一个可持续发展的安卓Client 。介绍了使用 Retrofit 来建立 Client 的一个方式。但后面在使用中遇到,如果每次调用接口请求都要处理 Response 的话,很多代码是重复的,而且不方便进行维护。所以有了这个文章。

Retrofit 基本使用。

Retrofit 的基本使用就是用一个接口来定义我们网络请求的行为,Retrofit 会根据这个定义行为的接口来构造对应的 Client, Client 拥有了我们接口定义的各种方法。

IApis net = ServiceGenerator.createServices(IApis.class);
Call<SrvResult> cb = net.getQqPhone("hahaha");
cb.enqueue(new NetCallback() {
@Override
public void onSuccessful(SrvResult response) {
System.out.println(response.getData());
}
});
  1. 我们调用 ServiceGenarator.createServices(IApis.class) 来建立一个 Client。
  2. 调用 Client 的方法,得到一个 Call。
  3. 将这个 Call 放入队列。
  4. 调用回调函数,响应我们的 Call。

在异步调用的时候(cb.enqueue()) 的时候,我们的回调实现了 Call 接口。

public interface Callback<T> {
void onResponse(Call<T> var1, Response<T> var2);

void onFailure(Call<T> var1, Throwable var2);
}

当请求成功,或失败的时候就会回调对应的方法。

在此,我想到的是使用一个实现了 Callback 接口的的类,在其中进行统一的处理。但是,有可能我们针对不同的返回结果,又需要进行不同的数据操作的时候,这又不足。

所以准备用抽象类来完成这个活。

NetCallback

由于我们的服务端返回的数据格式都是一致的:

public class SrvResult {

private int state;
private Object data;

public int getState() {
return state;
}

public void setState(int state) {
this.state = state;
}

public Object getData() {
return data;
}

public void setData(Object data) {
this.data = data;
}

}

所以我们可以统一解析为一致的格式。

对于出现失败的情况有两种:

  • HTTP 协议级别的异常失败
  • 应用返回表示此次请求数据逻辑不合法等等的失败
public abstract class NetCallback implements Callback<SrvResult> {
private static final String TAG = "NetCallback";

public abstract void onSuccessfull(SrvResult data);

@Override
public void onResponse(Call<SrvResult> call, Response<SrvResult> response) {
Response<SrvResult> res = response;
SrvResult data = response.body();
// 请求成功,http 协议返回代码 200-300
if (res.isSuccessful()) {
if (data.getState() != 200) {
if (data.getData() == null || TextUtils.isEmpty(data.getData().toString())) {
if (!TextUtils.isEmpty(CodeConfig.getCodeTip(data.getState()))) {
onFail(CodeConfig.getCodeTip(data.getState()));
} else {
onFail("请求失败,请重试");
}
} else {
onFail(data.getData().toString());
}
return;
}

onSuccessfull(data);
} else {
onFail(res.message());
}
}

@Override
public void onFailure(Call<SrvResult> call, Throwable t) {
Toast.makeText(SSVApplication.getInstance(), t.getMessage(), Toast.LENGTH_SHORT).show();
}

/**
* 错误提示
*/
protected void onFail(String s) {
Toast.makeText(SSVApplication.getInstance(), s, Toast.LENGTH_SHORT).show();
}
}

Retrofit 默认会成功时调用 onResponse 失败调用 onFailure。

所以我们只需要定义一个我们需要在数据响应成功时的方法就OK了。

注意:isSuccessful 返回的状态码是 200 -300

public boolean isSuccessful() {
return this.code >= 200 && this.code < 300;
}

HTTP 状态码

STATUE 说明
1xx 代表请求已被接受,需要继续处理 (临时响应)
2xx 代表请求已成功被服务器接收、理解、并接受
3xx 代表需要客户端采取进一步的操作才能完成请求
4xx 代表了客户端看起来可能发生了错误,妨碍了服务器的处理
5xx 表示服务器无法完成明显有效的请求