java - 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>>
以及在这种情况下是否有更合适的不同类型。
解决方案
如果您只关心 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 调用。
推荐阅读
- mysql - 在 MySQL 文档中哪里可以找到 const 的解释
- javascript - 尝试在firebase中链接多个身份验证提供程序时从error.email获取“未定义”
- flutter - 在同一个项目中获取多个 Flutter 应用
- angular - 在数组类型的 RxJS 主题上调用 .next() 不会通知观察者
- python - 如何在python中打开json文件
- java - 遇到 OutOfMemoryException 时删除 List<> 的一部分
- android - 如何在 as3 上实现运行时权限?
- reactjs - 如何将 DayPicker 链接到现有的输入元素
- javascript - pm2 autostart discord.js bot 在重新启动时不会再次连接(树莓派)
- php - PHP PDO 错误 [调用未定义的方法 PDOStatement]