没有响应正文时,RxJava捕获网络响应代码

时间:2018-06-20 21:53:46

标签: java android rx-java rx-java2

试图与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>>的使用以及在这种情况下是否存在更合适的其他类型。

2 个答案:

答案 0 :(得分:2)

如果您只关心Http代码响应,那么类似的内容应该可以解决:

Api:

@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处理与主体一起被视为IO操作-在这里我不知道您的期望意图,但是值得注意的是,当您进行需要与主体交互的api调用时。

答案 1 :(得分:0)

文档:

http://reactivex.io/RxJava/javadoc/rx/Observable.html#subscribe(rx.functions.Action1,%20rx.functions.Action1,%20rx.functions.Action0)

  

订阅subscribe(Action1 onNext,   Action1 onError,Action0 onCompleted)   订阅Observable,并提供回调以处理其发出的项目以及发出的任何错误或完成通知。

intToIntList :: Int -> Int -> [Int]
intToIntList m n | m >= n = []
                 | otherwise = m : intToIntList (m+1) n