Retrofit 使用flatmap操作符时处理错误、异常
2016-08-02 17:35
337 查看
在实际项目(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 优雅的处理服务器返回异常、错误
相关文章推荐
- Retrofit 使用flatmap操作符时处理错误、异常
- PHP 使用回调函数(set_error_handler)处理异常和错误
- 使用过多的递归出现错误,“System.StackOverflowException”类型的未经处理的异常在 mscorlib.dll 中发生
- 【POI xls Java map】使用POI处理xls 抽取出异常信息 --java1.8Group by ---map迭代 -- 设置单元格高度
- Retrofit+RxJava 优雅的处理服务器返回异常、错误
- sql server try...catch使用 异常处理 不错的SQL错误处理
- 书羊农历控件使用步骤及处理错误:引发了“System.Windows.Forms.AxHost.InvalidActiveXStateException”类型的异常
- 【GoLang】GoLang 错误处理 -- 使用异常的思路进行处理
- servlet使用声明式异常处理指定错误跳转页面,ie下无法正常显示
- PHP 错误与异常 笔记与总结(15 )使用观察者模式处理异常信息
- Retrofit请求数据对错误以及网络异常的处理
- 使用异常处理错误
- C#学习使用try-catch-finally错误处理表达式(续)--定义自己的异常消息类
- PHP5的异常处理机制[4]--PHP5之前的错误处理--使用PEAR处理错误
- PHP5的异常处理机制[5]--PHP5之前的错误处理--使用PEAR处理错误
- asp.net访问access 发生了未处理的异常 "操作必须使用一个可更新的查询"错误
- SpringBoot进阶之使用异常替代返回错误码(拦截异常并统一处理)
- 使用两个不同类型的数据进行加法计算时,使用异常处理语句捕获由于数据类型错误而出现的异常,发生生成错误。是否继续并运行上次的成功生成?
- Android Retrofit+RxJava 优雅的处理服务器返回异常、错误
- Retrofit请求数据对错误以及网络异常的处理