试图与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>>
的使用以及在这种情况下是否存在更合适的其他类型。
答案 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)
文档:
订阅subscribe(Action1 onNext, Action1 onError,Action0 onCompleted) 订阅Observable,并提供回调以处理其发出的项目以及发出的任何错误或完成通知。
intToIntList :: Int -> Int -> [Int]
intToIntList m n | m >= n = []
| otherwise = m : intToIntList (m+1) n