【发布时间】:2016-07-02 00:27:06
【问题描述】:
我有两个列表 - 每个列表都有它的 API,对于每个项目我都必须调用 API(使用 retrofit2 - android)。
我可以这样做吗?
我如何订阅他们的两个完成?
Observable<Integer> offerObservable = Observable.from(restDatabaseImages.getOfferImages());
Observable<Integer> otherOfferObservable = Observable.from(restDatabaseImages.getOtherOfferImages());
offerObservable.flatMap(new Func1<Integer, Observable<RestOfferImage>>() {
@Override
public Observable<RestOfferImage> call(Integer integer) {
return backendService.getDatabaseOfferImage(integer);
}
}).subscribe(new Action1<RestOfferImage>() {
@Override
public void call(RestOfferImage restOfferImage) {
offerService.saveOfferImage(restOfferImage);
}
});
otherOfferObservable.flatMap(new Func1<Integer, Observable<RestOtherOfferImage>>() {
@Override
public Observable<RestOtherOfferImage> call(Integer integer) {
return backendService.getDatabaseOtherOfferImage(integer);
}
}).subscribe(new Action1<RestOtherOfferImage>() {
@Override
public void call(RestOtherOfferImage restOtherOfferImage) {
otherOfferService.saveOtherOfferImage(restOtherOfferImage);
}
});
-- 更新:
我试着把它改写成这样。问题是我只看到执行了第一个 flatMap Func1 - 对于第一个条目...
Observable<Integer> offerObservable = Observable.from(restDatabaseImages.getOfferImages());
Observable<Integer> otherOfferObservable = Observable.from(restDatabaseImages.getOtherOfferImages());
Observable ob1 = offerObservable.flatMap(new Func1<Integer, Observable<RestOfferImage>>() {
@Override
public Observable<RestOfferImage> call(Integer integer) {
return backendService.getDatabaseOfferImage(integer);
}
}).map(new Func1<RestOfferImage, Void>() {
@Override
public Void call(RestOfferImage restOfferImage) {
offerService.saveOfferImage(restOfferImage);
return null;
}
});
Observable ob2 = otherOfferObservable.flatMap(new Func1<Integer, Observable<RestOtherOfferImage>>() {
@Override
public Observable<RestOtherOfferImage> call(Integer integer) {
return backendService.getDatabaseOtherOfferImage(integer);
}
}).map(new Func1<RestOtherOfferImage, Void>() {
@Override
public Void call(RestOtherOfferImage restOtherOfferImage) {
otherOfferService.saveOtherOfferImage(restOtherOfferImage);
return null;
}
});
ob1.zipWith(ob2, new Func2() {
@Override
public Object call(Object o, Object o2) {
return null;
}
}).subscribe(new Subscriber() {
@Override
public void onCompleted() {
Log.d("AllDone", "DA");
onLoadingFinishedListenerCallback.onLoading2Finished();
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Object o) {
}
});
【问题讨论】:
-
你的第二个版本看起来差不多。如果您没有看到调用的第二个平面地图,则可能意味着从 restDatabaseImages.getOtherOfferImages() 返回的可观察对象永远不会发出项目。你也可以粘贴输出吗?
-
@yurgis,对不起,我的意思是第二个 flatMap 没有被调用,但第一个地图也没有被调用。我已经放置了 Log.d() 所以我确定。
-
那么请更正您的问题。
标签: android rx-java reactive-programming rx-android