我沒有找到正確的方法。問題是,我有兩個改進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