上一篇文章写了Retrofit和RxJava的基本使用,最后的subscriber并没有写具体实现
成功的返回通常对应了各种不同的处理,而异常返回通常有着统一的处理
因此这一篇单独讲讲异常处理
Retrofit本身会抛出HttpException,Gson解析会抛出解析异常,
此外我们还应该处理与服务器约定好的“异常”,即上一篇提到的返回数据中result字段值不会0的情况
这里要先解决一个问题,就是Gson构建的对象,通过注解定义key名,以变量的类型定value的类型,
但如果同样的key在不同情况下属于不同的数据类型,就会出问题。
比如上一篇文章提及,服务器返回格式是
{
"result":"结果代号,0表示成功",
"msg":"成功返回时是消息数据列表,失败时是异常消息文本"
}
那么msg究竟应该定义为String,还是一个List呢
我找到的解决方法就是:
注册一个自定义的转换类GsonResponseBodyConverter
先用一个只含result变量的Model类去解析获得result值
如果失败,则用msg是String的Model类再去解析msg值,然后组成一个ResultException
如果成功,则按照原本的Model类解析
代码如下:
class GsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {
private final Gson gson;
private final Type type;
GsonResponseBodyConverter(Gson gson, Type type) {
this.gson = gson;
this.type = type;
}
@Override
public T convert(ResponseBody value) throws IOException{
String response = value.string();
try {
Log.d("Network", "response>>" + response);
//ResultResponse 只解析result字段
ResultResponse resultResponse = gson.fromJson(response, ResultResponse.class);
if (resultResponse.getResult() == 0){
//result==0表示成功返回,继续用本来的Model类解析
return gson.fromJson(response, type);
} else {
//Err