首页 > 解决方案 > 使用 RxJava2 改造响应代码

问题描述

所以我想在这个视频 droidcon NYC 2017 - Advanced Networking with RxJava + Retrofit中实现 API 响应的示例

这是我的代码:

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永远不会被调用,所以我只能在第一次接受时访问代码方法,但在视频中,他发现了该Throwable部分中的错误。所以,我无法弄清楚我做错了什么?也许我使用了错误的观察者?

标签: androidretrofit2rx-java2android-networking

解决方案


我想我明白了,如果我们用Observable<Response<Object>>所有响应代码包装我们的响应对象,那么我们将在常规的接受方法中捕获,所以我们需要手动提取代码并进行检查。但是,如果我们保持Observable<Object>, errorCode < 200 || errorCode > 400 将在 onError 方法中被捕获。


推荐阅读