【问题标题】:Wait for two observables to finish等待两个 observables 完成
【发布时间】: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


【解决方案1】:

我认为您正在寻找这样的东西:

public class SimpleTest {

    @Test
    public void testSample() {
        Integer[] offerImages = {1, 2, 3, 4, 5};
        Integer[] otherOfferImages = {6, 7, 8, 9, 10};

        Observable<Integer> offerObservable = Observable.from(offerImages).flatMap(someInt -> fakeApiCall(someInt));
        Observable<Integer> otherOfferObservable = Observable.from(otherOfferImages).flatMap(someInt -> fakeApiCall(someInt));

        Observable.zip(
                offerObservable,
                otherOfferObservable,
                (offer, otherOffer) -> String.format("Offer: %d - Other Offer: %d", offer, otherOffer)
        ).subscribe(data -> System.out.println(data));
    }

    private Observable<? extends Integer> fakeApiCall(Integer someInt) {
        return Observable.just(someInt * 10);
    }
}

Zip 运算符将确保您将这些事件一起发出,然后您可以使用它们生成一个新流。

上面的代码会打印这个:

Offer: 10 - Other Offer: 60
Offer: 20 - Other Offer: 70
Offer: 30 - Other Offer: 80
Offer: 40 - Other Offer: 90
Offer: 50 - Other Offer: 100

【讨论】:

  • 谢谢!如果 offerImages 或 otherOfferImages 为空怎么办?我想执行“订阅(数据-> System.out.println(数据)”。
猜你喜欢
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 2021-12-22
  • 2017-10-15
  • 1970-01-01
相关资源
最近更新 更多