【问题标题】:Rxjava2 - multi retrofit request and handle all exceptionRxjava2 - 多改造请求并处理所有异常
【发布时间】:2017-03-17 01:22:29
【问题描述】:

我是 Rxjava 的新手。好复杂……

我需要处理一个复杂的场景,我想知道如何使用 Rxjava 来制作它。

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

  1. 应用启动和splash 页面打开
  2. http reqesut check_update 检查应用是否需要更新。
  3. 如果应用有新版本必须更新,弹出一个通知对话框,只有一个update按钮;如果应用有新版本,但不是必须更新,则弹出一个带有 2 个按钮的对话框(updateignore);如果没有新版本,请继续。
  4. 不需要更新,所以我们需要跳转到home页面或login页面,根据当前auth_token状态。
  5. 从 sharedPreference 中读取 auth_token。然后调用http请求check_auth检查是否有效。如果有效,跳转到home页面;如果没有,请跳转到login 页面。

在这个过程中,涉及到 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() {

                }
            });

我说的对吗?你能回答我的问题(代码中的cmets)吗?

【问题讨论】:

    标签: android retrofit2 rx-java2


    【解决方案1】:

    根据文档onError“通知观察者 Observable 遇到了错误情况。”。所以这个回调与处理请求错误无关。

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

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

    @method(url)
    Call<CheckAuthResponse> 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() {
    
                    }
                });
    

    希望这会有所帮助;

    对不起我的英语。

    【讨论】:

    • ` if (retrofitResponce.code() == authInvalidCode ) { //do something }` 它是在 schedule.io 中运行的,所以如果我想展示一个 toast,我似乎做不到在这里。
    • 可以在map函数observeOn(Androidscheduler.mainThread())之前加上observeOn(relevantScheduler),如果你想在另一个线程中进行下一步操作。
    猜你喜欢
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 2019-10-04
    • 2014-03-19
    相关资源
    最近更新 更多