#网络请求异常封装
对于RxJava+Retrofit已经非常流行,博主也在公司项目中使用到了。其中的好处不用多说,今天就大致写一下对Retrofit请求异常的封装。
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(HttpHelper.getInstance().getmOkHttpClient())
.addCallAdapterFactory(RxErrorHandlingCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(new Gson()))
.build();
这是对Retrofit简单配置,这里重点讲一下addConverterFactory 的配置自定义一个call。
public class RxErrorHandlingCallAdapterFactory extends CallAdapter.Factory {
private final RxJavaCallAdapterFactory original;
private RxErrorHandlingCallAdapterFactory() {
original = RxJavaCallAdapterFactory.create();
}
public static CallAdapter.Factory create() {
return new RxErrorHandlingCallAdapterFactory();
}
@Override
public CallAdapter<?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {
return new RxCallAdapterWrapper(retrofit, original.get(returnType, annotations, retrofit));
}
private static class RxCallAdapterWrapper implements CallAdapter<Observable<?>> {
private final Retrofit retrofit;
private final CallAdapter<?> wrapped;
public RxCallAdapterWrapper(Retrofit retrofit, CallAdapter<?> wrapped) {
this.retrofit = retrofit;
this.wrapped = wrapped;
}
@Override
public Type responseType() {
return wrapped.responseType();
}
@SuppressWarnings("unchecked")
@Override
public <R> Observable<?> adapt(Call<R> call) {
return ((Observable) wrapped.adapt(call))
.onErrorResumeNext(new Func1<Throwable, Observable>() {
@Override
public Observable call(Throwable throwable) {
return Observable.error(asRetrofitException(throwable));
}
});
}
private RetrofitException asRetrofitException(Throwable throwable) {
// 不是200的情况,例如400,401,404等
if (throwable instanceof HttpException) {
HttpException httpException = (HttpException) throwable;
Response response = httpException.response();
return RetrofitException
.httpError(httpException.code(), response.raw().request().url().toString(), response,
retrofit);
}
// 网络出问题和超时处理
if (throwable instanceof IOException || throwable instanceof TimeoutException) {
return RetrofitException.networkError((Exception) throwable);
}
// 数据解析出现问题(方便调试和快速定位BUG)
if (throwable instanceof JsonSyntaxException || throwable instanceof JsonParseException
|| throwable instanceof JSONException || throwable instanceof ParseException) {
return RetrofitException.parseError((Exception) throwable);
}
return RetrofitException.unexpectedError(new Throwable());
}
}
}
这里当数据解析异常时,JsonSyntaxException 虽然继承ParseException但是似乎并没有卵用,如果不加JsonSyntaxException异常依旧走不到解析异常,这个要格外注意。