Retrofit+RxJava优雅的处理服务器返回异常错误Word文档下载推荐.docx
《Retrofit+RxJava优雅的处理服务器返回异常错误Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Retrofit+RxJava优雅的处理服务器返回异常错误Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
![Retrofit+RxJava优雅的处理服务器返回异常错误Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-10/10/43d70900-7ebc-4c9e-affa-065e4d2b238a/43d70900-7ebc-4c9e-affa-065e4d2b238a1.gif)
publicTdata;
}
网络异常导致的登录失败,在使用Retrofit+RxJava请求时都会直接调用subscribe的onError事件;
密码错误导致的登录失败,在使用Retrofit+RxJava请求时都会调用subscribe的onNext事件;
无论是异常还是错误,都要在subscribe里面处理异常信息,如下代码:
APIWrapper.getInstance().login("
username"
"
password"
)
.subscribe(newObserver<
Response<
User>
>
(){@OverridepublicvoidonCompleted(){
@Override
publicvoidonError(Throwablee){
publicvoidonNext(Response<
data){if(data.state==1001){
//
}elseif(data.state==1002){
});
现在我希望在发生任何错误的情况下,都会调用onError事件,并且由model来处理错误信息。
那么,此时我们就应该有一个ExceptionEngine来处理事件流中的错误信息了。
在工作流中处理异常
在正常情况下,我们获取网络数据的流程通常如下:
请求接口->
解析数据->
更新UI
整个数据请求过程都是发生在Rx中的工作流之中。
当有异常产生的时候,我们要尽量不在ui层里面进行判断,换句话说,我们没有必要去告诉ui层具体的错误信息,只需要让他弹出一个信息(Toast或者Dialog)展示我们给它的信息就行。
请求接口和数据解析都可能出错,所以在这两层进行错误处理。
为了更好的解耦,我们通过拦截器拦截错误,然后根据错误类型分发信息。
拦截器
数据解析层的拦截器
这个拦截器主要是为了获取具体的错误信息,分发给上层的UI,给用户以提示,增强用户体验。
publicObservable<
Weather>
getWeather(StringcityName){
returnweatherService.getWeather(cityName)
//拦截服务器返回的错误
.map(newServerResponseFunc<
())
//HttpResultFunc()为拦截onError事件的拦截器,后面会讲到,这里先忽略
.onErrorResumeNext(newHttpResponseFunc<
());
//拦截固定格式的公共数据类型Response<
判断里面的状态码
privateclassServerResponseFunc<
implementsFunc1<
T>
{
publicTcall(Response<
reponse){
//对返回码进行判断,如果不是0,则证明服务器端返回错误信息了,便根据跟服务器约定好的错误码去解析异常
if(reponse.state!
=0){
//如果服务器端有错误信息返回,那么抛出异常,让下面的方法去捕获异常做
统一处理
thrownewServerException(reponse.state,reponse.message);
}
//服务器请求数据成功,返回里面的数据实体
returnreponse.data;
所以整个逻辑是这样的:
所以在前三步的过程中,只要发生异常(服务器返回的错误也抛出了)都会抛出,这时候就触发了RxJava的OnError事件。
处理onError事件的拦截器
这个拦截器主要是将异常信息转化为用户”能看懂”的友好提示。
privateclassHttpResponseFunc<
Throwable,Observable<
{@Override
call(Throwablethrowable){
//ExceptionEngine为处理异常的驱动器
returnObservable.error(ExceptionEngine.handleException(throwable));
两个拦截器以前使用,代码如下:
//HttpResponseFunc()为拦截onError事件的拦截器
调用:
APIWrapper.getInstance().getWeather("
北京"
.subscribe(new
SampleProgressObserver<
(MainActivity.this){
@OverridepublicvoidonNext(WeatherBeanweatherBean){tv.setText(weatherBean.toString());
}});
相关类:
publicclassRxSubscriber<
extendsErrorSubscriber<
publicvoidonStart(){super.onStart();
DialogHelper.showProgressDlg(context,"
正在加载数据"
);
@OverridepublicvoidonCompleted(){
DialogHelper.stopProgressDlg();
@OverrideprotectedvoidonError(ApiExceptionex){
Toast.makeText(context,ex.message,Toast.LENGTH_SHORT).show();
publicvoidonNext(Tt){
publicabstractclassErrorSubscriber<
extendsObserver<
publicvoidonError(Throwablee){if(einstanceofApiException){onError((ApiException)e);
}else{onError(newApiException(e,123));
*错误回调
protectedabstractvoidonError(ApiExceptionex);
处理异常的驱动器
package;
import.ParseException;
importcom.google.gson.JsonParseException;
importorg.json.JSONException;
import.ConnectException;
importretrofit2.adapter.rxjava.HttpException;
/**
*CreatedbyLzxon2016/7/11.
publicclassExceptionEngine{
//对应HTTP的状态码
privatestaticfinalintUNAUTHORIZED=401;
privatestaticfinalintFORBIDDEN=403;
privatestaticfinalintNOT_FOUND=404;
privatestaticfinalintREQUEST_TIMEOUT=408;
privatestaticfinalintINTERNAL_SERVER_ERROR=500;
privatestaticfinalintBAD_GATEWAY=502;
privatestaticfinalintSERVICE_UNAVAILABLE=503;
privatestaticfinalintGATEWAY_TIMEOUT=504;
publicstaticApiExceptionhandleException(Throwablee){
ApiExceptionex;
if(einstanceofHttpException){//HTTP错误HttpExceptionhttpException=(HttpException)e;
ex=newApiException(e,ERROR.HTTP_ERROR);
switch(httpException.code()){
caseUNAUTHORIZED:
caseFORBIDDEN:
caseNOT_FOUND:
caseREQUEST_TIMEOUT:
caseGATEWAY_TIMEOUT:
caseINTERNAL_SERVER_ERROR:
caseBAD_GATEWAY:
caseSERVICE_UNAVAILABLE:
default:
ex.message="
网络错误"
;
//均视为网络错误break;
returnex;
}elseif(einstanceofServerException){//服务器返回的错误
ServerExceptionresultException=(ServerException)e;
ex=newApiException(resultException,resultException.code);
ex.message=resultException.message;
returnex;
}elseif(einstanceofJsonParseException
||einstanceofJSONException
||einstanceofParseException){
ex=newApiExcep