我没有找到正确的方法。问题是,我有两个改进API和服务,需要两个等待响应并做出决定并基于其他调用。RxJava和改造链从不同的服务和条件多个呼叫
例子:
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) ...
是否存在是真实的话,我需要调用
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一起等,但它工作无法正常链条,也是ErrorHandling中很奇怪,因为当我从后端得到一些错误时,我的应用程序会崩溃,这就是为什么我用OnComplete,OnError,OnNext添加每个调用Action3的原因。有没有可能用更少的代码来做到这一点?
谢谢
这是什么意思:y A/art:art/runtime/barrier.cc:90]检查失败:count_ == 0( count _ = - 1,0 = 0)试图消灭非零计数的屏障 A/art:art/runtime/runtime.cc:366]运行时中止---递归,所以没有线程特定的细节! A/libc:致命信号6(SIGABRT),代码-6中的tid 20983 –
不知道。我不在Android上开发。 – dwursteisen