RxJava 和 Retrofit 链接来自不同服务和条件的多个调用
RxJava and Retrofit Chain multiple Calls from diffrent Services and Conditions
我没有找到正确的方法。问题是,我有两个 Retrofit API´s 和服务,需要两个等待响应并根据其他调用做出决定。
示例:
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);
现在用例:
如果存在某些对象,我需要执行请求,例如:
serviceA.exists(id).flatMap(exists -> if(exists) ...
如果 Exists 为真,那么我需要调用
serviceB.addObjectB(b)
那么第一个流程就结束了。
如果 Exists 为假我需要调用
serviceA.addObject(a)
然后当我在 onNext 中获得成功时,我需要调用
ServiceB.addObject(b)
再次。但我真的没有用 RxJava 和 Retrofit 得到 Chain。我可以用很多行代码来处理这些东西,比如:
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。有没有可能用更少的代码来做到这一点?
谢谢
你用 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
,并且可能与您已经尝试过的相近。
我没有找到正确的方法。问题是,我有两个 Retrofit API´s 和服务,需要两个等待响应并根据其他调用做出决定。
示例:
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);
现在用例:
如果存在某些对象,我需要执行请求,例如:
serviceA.exists(id).flatMap(exists -> if(exists) ...
如果 Exists 为真,那么我需要调用
serviceB.addObjectB(b)
那么第一个流程就结束了。
如果 Exists 为假我需要调用
serviceA.addObject(a)
然后当我在 onNext 中获得成功时,我需要调用
ServiceB.addObject(b)
再次。但我真的没有用 RxJava 和 Retrofit 得到 Chain。我可以用很多行代码来处理这些东西,比如:
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。有没有可能用更少的代码来做到这一点?
谢谢
你用 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
,并且可能与您已经尝试过的相近。