java - RxJava在没有响应体时捕获网络响应代码

标签 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>> 的使用以及是否有其他类型更适合这种情况。

最佳答案

如果您只关心 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因为处理 body 被认为是 IO 操作 - 我不知道你在这里想要的 Intent ,但值得注意的是,当你进行需要与 body 交互的 api 调用时。

关于java - RxJava在没有响应体时捕获网络响应代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50957619/

相关文章:

Java - 将字符串(包括 EEST)转换为日期

java - 我如何参数化这个 Java 泛型?

java - RxJava : how to use Observable instead nested loops?

java - RxJava 组合可观察量而不重复执行

java - Observable.map 抛出错误未在订阅中捕获

java - NoClassDefFound错误: javafx/beans/InvalidationListener

java - 无法使用 messageSource 解析 spring 消息代码

java - 如何从http请求中获取json响应?

android - 在 sqlite 中正确升级表

Android Studio gradle 构建卡在应用程序 :processDebugResources