Retrofit+RxJava优雅的处理服务器返回异常错误Word文档下载推荐.docx

上传人:b****3 文档编号:13920967 上传时间:2022-10-15 格式:DOCX 页数:13 大小:29.20KB
下载 相关 举报
Retrofit+RxJava优雅的处理服务器返回异常错误Word文档下载推荐.docx_第1页
第1页 / 共13页
Retrofit+RxJava优雅的处理服务器返回异常错误Word文档下载推荐.docx_第2页
第2页 / 共13页
Retrofit+RxJava优雅的处理服务器返回异常错误Word文档下载推荐.docx_第3页
第3页 / 共13页
Retrofit+RxJava优雅的处理服务器返回异常错误Word文档下载推荐.docx_第4页
第4页 / 共13页
Retrofit+RxJava优雅的处理服务器返回异常错误Word文档下载推荐.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

Retrofit+RxJava优雅的处理服务器返回异常错误Word文档下载推荐.docx

《Retrofit+RxJava优雅的处理服务器返回异常错误Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Retrofit+RxJava优雅的处理服务器返回异常错误Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。

Retrofit+RxJava优雅的处理服务器返回异常错误Word文档下载推荐.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1