zoukankan      html  css  js  c++  java
  • Retrofit 使用flatmap操作符时处理错误、异常

    在实际项目(Retrofit+RxJava框架)中,有时需要先登录,获取token后再去获取用户信息,此时我们使用flatmap操作符比较好。

    在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 优雅的处理服务器返回异常、错误

     
  • 相关阅读:
    Java基础12-继承(思想、覆盖、super,子类初始化)
    Java基础11-封装(思想、访问权限、this、构造方法)
    Java基础10-方法的重载与递归
    Java基础9-java的类、对象和方法
    Java基础8-浅谈java程序的运行机制与JVM运行
    Java基础7-数组
    Java基础6-控制语句
    Java基础5-运算符
    python socket编程基础
    python 之 异常处理
  • 原文地址:https://www.cnblogs.com/android-blogs/p/5741564.html
Copyright © 2011-2022 走看看