Android Rxjava2-多重改装请求和处理所有异常

Android Rxjava2-多重改装请求和处理所有异常,android,retrofit2,rx-java2,Android,Retrofit2,Rx Java2,我是Rxjava新手。太复杂了 我需要处理一个复杂的场景,我想知道如何使用Rxjava实现它 这是关于应用程序启动的逻辑: 应用程序启动并启动splash页面打开 使http请求检查\u update以检查应用程序是否需要更新 如果应用程序有新版本并且必须更新,则弹出一个通知对话框,其中只有一个更新按钮;如果应用程序有新版本,但不必更新,则弹出一个带有2个按钮的对话框(update和ignore);如果没有新版本,请下一步 无需更新,因此我们需要根据当前的auth_令牌状态跳转到home页面或l

我是Rxjava新手。太复杂了

我需要处理一个复杂的场景,我想知道如何使用Rxjava实现它

这是关于应用程序启动的逻辑:

  • 应用程序启动并启动
    splash
    页面打开
  • 使http请求
    检查\u update
    以检查应用程序是否需要更新
  • 如果应用程序有新版本并且必须更新,则弹出一个通知对话框,其中只有一个
    更新
    按钮;如果应用程序有新版本,但不必更新,则弹出一个带有2个按钮的对话框(
    update
    ignore
    );如果没有新版本,请下一步
  • 无需更新,因此我们需要根据当前的
    auth_令牌
    状态跳转到
    home
    页面或
    login
    页面
  • 从SharedReference读取身份验证令牌。然后调用http request
    check\u auth
    检查它是否有效。如果有效,跳转到
    主页
    页面;如果没有,请跳转到
    登录
    页面
  • 在这个过程中,涉及2个http请求和大量的条件检查。http请求错误也需要处理,这个过程可以用一个
    Rxjava
    编写吗

    我想我可以这样做,但我不确定这是否正确

    mRetrofitService.checkUpdate(new CheckUpdateRequest("android", "0.0.1")) // check update request
                .compose(RxUtil.applyScheduler()) // scheduler
                .flatMap(RxUtil.applyFunction()) // handle the response.
                .flatMap((Function<CheckUpdateResponse, ObservableSource<?>>) checkUpdateResponse -> {
                    int updateMode;
                    if (checkUpdateResponse.isHas_new_version()) {
                        if (checkUpdateResponse.isForce_update()) {
                            updateMode = FORCE_UPDATE; // 1
                        } else {
                            updateMode = CHOOSE_UPDATE; // 2
                        }
                    }  else {
                        updateMode = NO_UPDATE; // 0
                    }
                    return Observable.just(updateMode);
                })
                .flatMap(o -> {
                    if (Integer.parseInt(o.toString()) == NO_UPDATE) {
                        return mRetrofitService.checkAuth();
                    }
                    return null; //what should I return for pop up dialog?
                })
                .flatMap(RxUtil.applyFunction())
                .subscribe(new Observer<CheckAuthResponse>() {
                    @Override
                    public void onSubscribe(Disposable d) {
    
                    }
    
                    @Override
                    public void onNext(CheckAuthResponse checkAuthResponse) {
                        // valid
                        gotoHome();
                    }
    
                    @Override
                    public void onError(Throwable e) {
                        // should I handle pop here?
                        // should I handle auth invalid here?
                        // should I handle checkUpdate request error here?
                        // should I handle checkAuth here?
                        // how to distinguish these errors?
                    }
    
                    @Override
                    public void onComplete() {
    
                    }
                });
    
    mRetrofitService.checkUpdate(新的CheckUpdateRequest(“android”,“0.0.1”)//检查更新请求
    .compose(RxUtil.applyScheduler())//调度程序
    .flatMap(RxUtil.applyFunction())//处理响应。
    
    .flatMap((函数)根据文档“通知观察者被观察对象遇到错误情况”。因此此回调与处理请求错误无关

    我建议您使用改装类来处理不同的情况

    例如,您可以这样定义您的服务:

    @method(url)
    Call<CheckAuthResponse> checkUpdate(...);
    
    @方法(url)
    调用checkUpdate(…);
    
    在您的rx工作流程中:

    mRetrofitService.checkUpdate(new CheckUpdateRequest("android", "0.0.1")) // check update request
                .compose(RxUtil.applyScheduler()) // scheduler
                .flatMap(RxUtil.applyFunction()) // handle the response.
                .map((Function<Response<CheckUpdateResponse>, CheckUpdateResponse>) retrofitResponse -> {
                    if ( retrofitResponce.code() == authInvalidCode ) {
                      //do something
                     } else if (...) {
    
                     }
                     return retrofitResponse.body()
                })
                .flatMap((Function<CheckUpdateResponse, ObservableSource<?>>) checkUpdateResponse -> {
                    int updateMode;
                    if (checkUpdateResponse.isHas_new_version()) {
                        if (checkUpdateResponse.isForce_update()) {
                            updateMode = FORCE_UPDATE; // 1
                        } else {
                            updateMode = CHOOSE_UPDATE; // 2
                        }
                    }  else {
                        updateMode = NO_UPDATE; // 0
                    }
                    return Observable.just(updateMode);
                })
                .flatMap(o -> {
                    if (Integer.parseInt(o.toString()) == NO_UPDATE) {
                        return mRetrofitService.checkAuth();
                    }
                    return null; //what should I return for pop up dialog?
                })
                .flatMap(RxUtil.applyFunction())
                .subscribe(new Observer<CheckAuthResponse>() {
                    @Override
                    public void onSubscribe(Disposable d) {
    
                    }
    
                    @Override
                    public void onNext(CheckAuthResponse checkAuthResponse) {
                        // valid
                        gotoHome();
                    }
    
                    @Override
                    public void onError(Throwable e) {
                        // should I handle pop here?
                        // should I handle auth invalid here?
                        // should I handle checkUpdate request error here?
                        // should I handle checkAuth here?
                        // how to distinguish these errors?
                    }
    
                    @Override
                    public void onComplete() {
    
                    }
                });
    
    mRetrofitService.checkUpdate(新的CheckUpdateRequest(“android”,“0.0.1”)//检查更新请求
    .compose(RxUtil.applyScheduler())//调度程序
    .flatMap(RxUtil.applyFunction())//处理响应。
    .map((功能)响应->{
    if(reformationResponse.code()==authInvalidCode){
    //做点什么
    }否则如果(…){
    }
    返回response.body()
    })
    
    .flatMap((函数`if(reformationResponse.code()==authInvalidCode){//do something}`在schedule.io中运行,因此如果我想展示一个toast,似乎我无法在这里完成。您可以在映射函数observeOn(Androidscheduler.mainThread())之前添加一个add observeOn(relevantScheduler)如果要在另一个线程中执行下一个操作,请在之后执行。