Retrofit 使用flatmap操作符时处理错误、异常
2016-08-05 15:33
399 查看
在实际项目(Retrofit+RxJava框架)中,有时需要先登录,获取token后再去获取用户信息,此时我们使用flatmap操作符比较好。
在RESTResult对象里,包括请求返回的状态:失败还是成功,错误码,User对象等等,我们根据接口先定义一个返回数据Response实体类:
逻辑处理:
登录失败,直接触发onError;
登录成功,根据获得的token请求用户信息接口最终调用subscribe的onNext事件;
如下代码所示:
根据上面代码,登陆失败后的处理很关键:
无论何种原因造成的登陆失败,都应跟用户提示。
ApiException代码:
通过RxJava的链式操作,结合恰当的操作符,不仅可以把正常的数据源发射给观察者,同时也可以将错误异常数据源发射给观察者,RxJava比想象中的更强大!
更多参考:Retrofit+RxJava 优雅的处理服务器返回异常、错误
在RESTResult对象里,包括请求返回的状态:失败还是成功,错误码,User对象等等,我们根据接口先定义一个返回数据Response实体类:
public class Response<T> extends Entity { public boolean isSuccess() { return infoCode == 1; } public boolean isTokenExpired() { return infoCode == -1; } public int infoCode; public String message; public int size; public T data; }
逻辑处理:
登录失败,直接触发onError;
登录成功,根据获得的token请求用户信息接口最终调用subscribe的onNext事件;
如下代码所示:
private void login(final String phone , final String password){ APIWrapper.getInstance().login(phone, password) .flatMap(new Func1<Response<TokenEntity>, Observable<Response<UserInfo>>>() { @Override public Observable<Response<UserInfo>> call(Response<TokenEntity> response) { if (response.isSuccess()) { TokenEntity tokenEntity = response.data; return APIWrapper.getInstance().getUserInfo(tokenEntity.token); } else { return Observable.error(new ApiException(response.message)); } } }) .compose(new RxHelper<Response<UserInfo>>(getString(R.string.wait_to_login_tip)).io_main(LoginActivity.this)) .subscribe(new RxSubscriber<Response<UserInfo>>(this,USER_LOGIN) { @Override public void _onNext(Response<UserInfo> response) { if (response.isSuccess()) { UserInfo userInfo = response.data; if (null != userInfo) { AppApplication.getInstance().saveUserInfo(userInfo); } finish(); } } @Override public void _onError(String msg) { ToastUtils.show(LoginActivity.this, msg); } }); }
根据上面代码,登陆失败后的处理很关键:
if (response.isSuccess()) { TokenEntity tokenEntity = response.data; return APIWrapper.getInstance().getUserInfo(tokenEntity.token); } else { return Observable.error(new ApiException(response.message));
无论何种原因造成的登陆失败,都应跟用户提示。
ApiException代码:
public class ApiException extends RuntimeException { public static final int USER_NOT_EXIST = 100; public static final int WRONG_PASSWORD = 101; public static final int ERROR = 2001; public ApiException(int resultCode) { this(getApiExceptionMessage(resultCode)); } public ApiException(String detailMessage) { super(detailMessage); } /** * 由于服务器传递过来的错误信息直接给用户看的话,用户未必能够理解 * 需要根据错误码对错误信息进行一个转换,在显示给用户 * @param code * @return */ private static String getApiExceptionMessage(int code){ String message ; switch (code) { case USER_NOT_EXIST: message = "该用户不存在"; break; case WRONG_PASSWORD: message = "密码错误"; break; default: message = "未知错误"; } return message; } }
通过RxJava的链式操作,结合恰当的操作符,不仅可以把正常的数据源发射给观察者,同时也可以将错误异常数据源发射给观察者,RxJava比想象中的更强大!
更多参考:Retrofit+RxJava 优雅的处理服务器返回异常、错误
相关文章推荐
- Insight mvc:resources cache-period 解析
- Unity Editor中使用AssetBundle里的shader遇到的问题
- HDU-5795-A Simple Nim-博弈(SG函数)打表找规律
- java数据转换error:java.math.BigDecimal cannot be cast to java.lang.Double
- 【ArcGIS for JavaScript】加载地图,并标注点
- android6.0蓝牙配对加入提示音
- KMP算法
- CentOS 安装 jdk
- Hadoop权威指南:MapReduce应用开发
- 读书笔记四
- 如果读取图像的图像出现坏图,无法读取的怎么办?怎么自动跳过坏的图像,而读取下一张?
- 补充-昨天使用二叉树存储数据的实现
- yii邮件发送
- B站的DanmakuFlameMaster的使用
- 云展网PDF合并工具 v1.1.0 官方免费版
- window下搭建cowboy_app
- C++引用和指针的区别
- 数论概述及检索
- nginx配置startssl
- android -详谈Style和Theme