【发布时间】:2016-08-19 08:23:49
【问题描述】:
我没有找到正确的方法。问题是,我有两个 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);
现在是用例:
如果某些对象存在,我需要做一个请求:
serviceA.exists(id).flatMap(exists -> if(exists) ...
如果 Exists 为真,那么我需要调用
serviceB.addObjectB(b)
那么第一个流程就结束了。
如果 Exists 为假,我需要调用
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。有没有可能用更少的代码做到这一点?
谢谢
【问题讨论】:
标签: java android rest rx-java retrofit2