使用RxJava2改造响应代码

时间:2018-06-20 10:11:07

标签: android retrofit2 rx-java2 android-networking

所以我想像这个视频一样实现来自API的响应示例 droidcon NYC 2017 - Advanced Networking with RxJava + Retrofit

这是我的代码:

Presenter.java

compositeDisposable.add(RetrofitClient.createService(GetApi.class)
            .getResponseFromServer(token)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<ResponseFromServer>() {
                @Override
                public void accept(ResponseFromServer responseFromServer) throws Exception {
                    mView.setResponseObject(responseFromServer);
                }
            }, new Consumer<Throwable>() {
                @Override
                public void accept(Throwable throwable) throws Exception {
                    throwable.printStackTrace();
                    if (throwable instanceof HttpException) {
                        int responseCode = ((HttpException) throwable).code();
                    }

                }
            }));

因此,在这里,当我从服务器收到一些4xx错误响应时,我可以转到Throwable并获取响应代码,如果响应正常,则可以获取我的对象,并且一切都很好。

但是,在上面的视频示例中,那个人建议我将ResponseFromServer用Response包裹起来,如下所示: Single<Response<ResponseFromServer>> getResponseFromServer(@Header("X-Authorize") String token);,因此我也可以访问响应代码,但是在那种情况下,我的Throwable永远不会被调用,因此我只能在第一种accept方法中访问代码,但是在视频中他捕获了错误在Throwable部分中。所以,我不能弄清楚我在做什么错?也许我使用了错误的观察者?

2 个答案:

答案 0 :(得分:3)

我想我已经弄清楚了,如果我们用Observable<Response<Object>>包装我们的响应对象,所有响应代码都将被常规的accept方法捕获,因此我们有点需要手动提取代码并进行检查。但是,如果我们保留Observable<Object>,则errorCode <200 || errorCode> 400将被onError方法捕获。

答案 1 :(得分:2)

在这些情况下,如果来自服务器的响应为code < 200 || code >= 300,则将调用onError()。其他onNext()会调用。

此外,如果您来自onNext()的代码抛出任何异常,则会在onError()中捕获