我没有得到正确的方法。问题是,我有两个Retrofit API和服务,需要两个等待响应并根据其他调用做出决定。
示例:
APIX:
@GET("xyz/{id}/exists")
Observable<Exists> checkObjectExists(@Path("id") String id);
@POST("xyz/")
Observable<Object> addObjectA(@Body Object a);
APIy:
@POST("abc/{id}/blabla")
Observable<Object> addObjectB(@Path("id") String id, @Body Object b);
现在用例:
如果某些Object存在,我需要执行请求:
serviceA.exists(id).flatMap(exists -> if(exists) ...
如果Exists为true,那么我需要调用
serviceB.addObjectB(b)
然后第一个流程结束。
如果Exists为false,我需要致电
serviceA.addObject(a)
然后当我在onNext上获得成功时,我需要调用
ServiceB.addObject(b)
一次。但我真的没有RxJava和Retrofit的链条。我可以使用类似的代码处理这些东西:
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连接所有东西等等,但它在链中工作不正确而且ErrorHandling很奇怪,因为当我从后端得到一些错误时我的应用程序会崩溃,这就是为什么我添加每一个使用OnComplete,OnError,OnNext调用Action3。有没有可能用更少的代码来做到这一点?
由于
答案 0 :(得分:1)
您在flatMap
尝试了什么?
关于您的代码,然后根据结果checkObjectExists
然后addObjectA
或仅addObjectB
来调用addObjectB
。
所以,它可以这样实现:
ServiceA serviceA= ServiceA.create();
ServiceA serviceB= ServiceB.create();
serviceA.checkObjectExists(id)
.flatMap(exists -> {
if(exists) {
return serviceB.addObjectB(id, b)
} else {
return serviceA.addObjectA(id, a).flatMap(newA -> serviceB.addObject(id, newA);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe();
(因为它错过了您的代码的某些部分,很难从a
,b
和其他变量来自哪里。
正如您所看到的,它只依赖于flatMap
,可能会对您已经尝试过的内容关闭。