我是RxJava的新手,我有一些痛苦要执行我的第一个“艰难的”#39;查询。
我有两个由Retrofit生成的Observable,一个是' ping'一个新的api,另一个是旧的api。第一个将查询' http://myurl.com/newapi/ping',第二个' http://myurl.com/oldapi/ping'。此请求的结果并不重要,我只想知道服务器是使用新API还是旧API。
所以我想同时调用两个observable,最后在最后有一个布尔值,知道我是否使用旧的或新的api。
我尝试了类似的东西
Observable.mergeDelayError(obsOldApi,obsNewApi)
.observeOn(AndroidSchedulers.mainThread(), true)
.subscribeOn(Schedulers.io())
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
}
});
但onError将被调用一次(我希望只有在两个请求都失败时才调用它)并且当调用onNext时,我不知道它来自哪个请求(旧的或新的api?)。 / p>
谢谢你的帮助
答案 0 :(得分:3)
为简单起见,假设您已收到关于哪个API可用的"NEW"
或"OLD"
。
您的操作难度是管理错误:RxJava将错误作为终端状态进行处理。因此,您必须使用.onErrorResumeNext()
来忽略此错误。
Observable<String> theOld = oldApi.map(r -> "OLD")
// ignore errors
.onErrorResumeNext(Obervable.empty());
Observable<String> theNew = newApi.map(r -> "NEW")
.onErrorResumeNext(Obervable.empty());
Observable.merge(theOld, theNew)
.first() // if both api are in errors
.subscribe(api -> System.out.println("Available API : "+api));
我添加了运算符first
:它只需要第一个结果("OLD"
或"NEW"
),但如果前一个Observable
为空,则会触发错误,这是两种API都不可用的情况。