Retrofit+RxJava优雅的处理服务器返回异常错误.docx
- 文档编号:1000110
- 上传时间:2022-10-15
- 格式:DOCX
- 页数:13
- 大小:29.20KB
Retrofit+RxJava优雅的处理服务器返回异常错误.docx
《Retrofit+RxJava优雅的处理服务器返回异常错误.docx》由会员分享,可在线阅读,更多相关《Retrofit+RxJava优雅的处理服务器返回异常错误.docx(13页珍藏版)》请在冰豆网上搜索。
Retrofit+RxJava优雅的处理服务器返回异常错误
Retrofit+RxJava优雅的处理服务器返
回异常、错误
异常&错误
实际开发经常有这种情况,比如登录请求,接口返回的信息包括请求返回的状态:
失败还是成功,错误码,User对象等等。
如果网络等原因引起的登录失败可以归结为异常,如果是用户信息输入错误导致的登录失败算是错误。
假如服务器返回的是统一数据格式:
*标准数据格式
*@param
*/
publicclassResponse
publicStringmessage;publicTdata;
}
网络异常导致的登录失败,在使用Retrofit+RxJava请求时都会直接调用subscribe的onError事件;
密码错误导致的登录失败,在使用Retrofit+RxJava请求时都会调用subscribe的onNext事件;无论是异常还是错误,都要在subscribe里面处理异常信息,如下代码:
APIWrapper.getInstance().login("username","password")
.subscribe(newObserver
}
@Override
publicvoidonError(Throwablee){
}
@Override
publicvoidonNext(Response
//
}elseif(data.state==1002){
});
现在我希望在发生任何错误的情况下,都会调用onError事件,并且由model来处理错误信息。
那么,此时我们就应该有一个ExceptionEngine来处理事件流中的错误信息了。
在工作流中处理异常
在正常情况下,我们获取网络数据的流程通常如下:
请求接口->解析数据->更新UI
整个数据请求过程都是发生在Rx中的工作流之中。
当有异常产生的时候,我们要尽量不在ui层里面进行判断,换句话说,我们没有必要去告诉ui层具体的错误信息,只需要让他弹出一个信息(Toast或者Dialog)展示我们给它的信息就行。
请求接口和数据解析都可能出错,所以在这两层进行错误处理。
为了更好的解耦,我们通过拦截器拦截错误,然后根据错误类型分发信息。
拦截器
数据解析层的拦截器
这个拦截器主要是为了获取具体的错误信息,分发给上层的UI,给用户以提示,增强用户体验。
publicObservable
returnweatherService.getWeather(cityName)
//拦截服务器返回的错误
.map(newServerResponseFunc
//HttpResultFunc()为拦截onError事件的拦截器,后面会讲到,这里先忽略
.onErrorResumeNext(newHttpResponseFunc
}
//拦截固定格式的公共数据类型Response
privateclassServerResponseFunc
@Override
publicTcall(Response
//对返回码进行判断,如果不是0,则证明服务器端返回错误信息了,便根据跟服务器约定好的错误码去解析异常
if(reponse.state!
=0){
//如果服务器端有错误信息返回,那么抛出异常,让下面的方法去捕获异常做
统一处理
thrownewServerException(reponse.state,reponse.message);}
//服务器请求数据成功,返回里面的数据实体
returnreponse.data;
}
}
所以整个逻辑是这样的:
所以在前三步的过程中,只要发生异常(服务器返回的错误也抛出了)都会抛出,这时候就触发了RxJava的OnError事件。
处理onError事件的拦截器
这个拦截器主要是将异常信息转化为用户”能看懂”的友好提示。
privateclassHttpResponseFunc
publicObservable
//ExceptionEngine为处理异常的驱动器
returnObservable.error(ExceptionEngine.handleException(throwable));
}
}
两个拦截器以前使用,代码如下:
publicObservable
returnweatherService.getWeather(cityName)
//拦截服务器返回的错误
.map(newServerResponseFunc
//HttpResponseFunc()为拦截onError事件的拦截器
.onErrorResumeNext(newHttpResponseFunc
}
调用:
APIWrapper.getInstance().getWeather("北京")
.subscribe(new
SampleProgressObserver
@OverridepublicvoidonNext(WeatherBeanweatherBean){tv.setText(weatherBean.toString());
}});
相关类:
publicclassRxSubscriber
@Override
publicvoidonStart(){super.onStart();DialogHelper.showProgressDlg(context,"正在加载数据");
}
@OverridepublicvoidonCompleted(){
DialogHelper.stopProgressDlg();
}
@OverrideprotectedvoidonError(ApiExceptionex){
DialogHelper.stopProgressDlg();Toast.makeText(context,ex.message,Toast.LENGTH_SHORT).show();
}
@Override
publicvoidonNext(Tt){
}
}
publicabstractclassErrorSubscriber
@Override
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Retrofit RxJava 优雅 处理 服务器 返回 异常 错误
![提示](https://static.bdocx.com/images/bang_tan.gif)