首页 > 解决方案 > RxJava 在没有响应体时捕获网络响应代码

问题描述

试图跟上 RxJava 的速度。我有一个不返回数据的网络调用。唯一的响应是代码(快乐路径:200,否则为 4xx)。我想听这个响应,但我能找到的只是如何使用某种响应对象来做到这一点。

@GET
Observable<Response<ResponseBody>> makeHttpCall(@Url String url);

所以我的 RxJava 代码如下所示:

myRetrofit.makeHttpCall(url)
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Observer<Response<ResponseBody>>() {
        @Override
        public void onCompleted() {
            Timber.d("on completed");
        }

        @Override
        public void onError(Throwable e) {
            if (!(e instanceof EOFException)) {
                Timber.e(e, "error occurred");
            }
        }

        @Override
        public void onNext(Response<ResponseBody> responseBodyResponse) {
            Timber.d("on next");
        }
    });

这可行,但似乎是错误的解决方案。我不喜欢我的观察者如何进入 onError 方法。我的回复是 200,所以我想在 onNext 或 onCompleted 方法中看到它。

我研究过使用 Completable,但这根本不起作用。但是,我仍然认为这可能是正确的方法。

这里最好的方法是什么?我想知道这个问题是否只是追溯到我的使用,<Response<ResponseBody>>以及在这种情况下是否有更合适的不同类型。

标签: javaandroidrx-javarx-java2

解决方案


如果您只关心 Http 代码响应,那么应该会出现这样的情况:

接口:

@GET
Single<Response<ResponseBody>> makeHttpCall(@Url String url);

称呼:

myRetrofit.makeHttpCall(url)
                    .subscribeOn(Schedulers.io())
                    .map(Response::code)
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(
                            i -> Timber.d("code " + i),
                            e -> {
                                if (!(e instanceof EOFException)) {
                                    Timber.e(e, "error occurred");
                                }
                            });

另请注意,在您的原始代码中,您将 传递Response<ResponseBody>Observer主线程 - 与ResponseBody该线程上NetworkOnMainThreadException的需要与主体交互的 api 调用。


推荐阅读