尝试快速了解 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/