没有响应主体时的RxJava捕获网络响应代码

没有响应主体时的RxJava捕获网络响应代码,java,android,rx-java,rx-java2,Java,Android,Rx Java,Rx Java2,试图跟上RxJava的速度。我有一个不返回任何数据的网络呼叫。唯一的响应是代码(快乐路径:200,否则为4xx)。我想听听这个响应,但我所能找到的只是如何使用某种响应对象 @GET Observable<Response<ResponseBody>> makeHttpCall(@Url String url); @GET 可观察的makeHttpCall(@Url字符串Url); 因此,我的RxJava代码如下所示: myRetrofit.makeHttpCall(u

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

@GET
Observable<Response<ResponseBody>> makeHttpCall(@Url String url);
@GET
可观察的makeHttpCall(@Url字符串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");
        }
    });
myRefundation.makeHttpCall(url)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.订阅(新观察员){
@凌驾
未完成的公共无效(){
木材d(“完工时”);
}
@凌驾
公共无效申报人(可丢弃的e){
如果(!(EOFEException的e实例)){
Timber.e(e,“发生错误”);
}
}
@凌驾
public void onNext(Response-responseBodyResponse){
Timber.d(“下一页”);
}
});
这是可行的,但似乎是错误的解决方案。我不喜欢我的观察者陷入onError方法。我的回答是200,所以我希望在onNext或onCompleted方法中看到它

我考虑过使用Completable,但那根本不起作用。然而,我仍然认为这可能是正确的选择

这里最好的方法是什么?我想知道这个问题是否仅仅是因为我使用了
,是否有一种不同的类型更适合这种情况。

文档:

订阅订阅(Action1 onNext, 操作1错误,操作0未完成) 订阅Observable并提供回调来处理它发出的项以及它发出的任何错误或完成通知


如果您只关心Http代码响应,那么应该执行以下操作:

Api:


还请注意,在原始代码中,您将
响应
传递给主线程上的
观察者
——与此线程上的
响应主体
交互将导致
网络维护线程异常
,因为处理主体被视为IO操作——我不知道您在这里的意图,但值得注意的是,当您进行需要与主体交互的api调用时

谢谢。我真的不认为这个解决方案能改善我自己。也许我应该更具体一些(并相应地编辑我的op)。我希望找到一些东西,这样我就可以进入onNext或onCompleted,而不是onError方法。这就是我认为我的解决方案有点粗糙的地方。@Alex我认为如果你永远不想调用
onError()
或者
onErrorResumeNext()
的话,你需要
onError()
,或者在你的链中使用
过滤器来只允许响应代码200。我同意你最初的问题(和标题)是误导性的,因为你有很多方法可以做到这一点。
myRetrofit.makeHttpCall(url)
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(n->Timber.d("on next"), e->{
            if (!(e instanceof EOFException)) {
                Timber.e(e, "error occurred");
            }
     }, ()->Timber.d("on completed"));
@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");
                                }
                            });