java RxJava和翻新链接来自不同服务和条件的多个调用
我走错了路。问题是,我有两个改型API和服务,需要两个等待响应并根据其他调用做出决定
例如:
APIx:
@GET("xyz/{id}/exists")
Observable<Exists> checkObjectExists(@Path("id") String id);
@POST("xyz/")
Observable<Object> addObjectA(@Body Object a);
阿皮:
@POST("abc/{id}/blabla")
Observable<Object> addObjectB(@Path("id") String id, @Body Object b);
现在是用例:
如果存在以下对象,我需要执行请求:
serviceA.exists(id).flatMap(exists -> if(exists) ...
如果存在是真的,那么我需要打电话
serviceB.addObjectB(b)
然后第一个流程完成
如果存在是假的,我需要打电话
serviceA.addObject(a)
然后,当我在onNext获得成功时,我需要打电话
ServiceB.addObject(b)
再说一遍。但我真的没有得到RxJava和改装的链条。我可以用很多行代码处理这些东西,比如:
private void _checkExists() {
ServiceA serviceA= ServiceA.create();
serviceA.checkObjectExists(id)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new Subscriber<Exists>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.d("Something get Wrong");
}
@Override
public void onNext(Exists exists) {
if(exists) {
_addObjectB(b);
} else {
addobjectA(a);
}
}
});
}
private void addObjectA(Object a) {
ServiceA serviceA= ServiceA.create();
serviceA.addObjectA(a)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new Subscriber<Object>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.d("Something get Wrong");
}
@Override
public void onNext(Object a) {
addObjectB();
}
});
}
private void addObjectB() {
ServiceB serviceB= ServiceB .create();
serviceB.addObjectB(id, b)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Object>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Timber.d("Something get Wrong");
}
@Override
public void onNext(Object b) {
Timber.d("Everything is ok");
}
});
}
我尝试用flatMap等工具将所有内容链接在一起,但它在链接中无法正常工作,而且错误处理也很奇怪,因为当我从后端收到一些错误时,我的应用程序将崩溃,这就是为什么我使用OnComplete、OnError、OnNext添加每个调用Action3的原因。有没有可能用更少的代码来实现这一点
谢谢
# 1 楼答案
你用
flatMap
试过什么关于您的代码,根据结果
addObjectA
然后addObjectB
或者仅addObjectB
,您可以调用checkObjectExists
然后因此,可以这样实现:
(由于它遗漏了代码的某些部分,因此很难理解
a
、b
和其他变量的来源正如您所看到的,它只依赖于
flatMap
,并且可能与您已经尝试过的内容接近