RxJava结合了observable而不重复执行

时间:2016-11-16 17:26:44

标签: java rx-java rx-android rx-java2

短篇小说: 我有一种情况,我有2个Observables只有一个目的:

  • 他们收到一些数据
  • 他们返回修改后的数据
  • 如果无法处理数据则抛出错误

他们每个人都负责处理不同类型的数据。另外,我想在处理两个数据时做点什么。

我目前最好的实现如下,这些是我的Observables:

    Single<BlueData> blueObservable = Single.create(singleSubscriber -> {
        if (BlueDataProcessor.isDataValid(myBlueData)) {
            singleSubscriber.onSuccess(BlueDataProcessor.process(myBlueData));
        }
        else {
            singleSubscriber.onError(new BlueDataIsInvalidThrow());
        }
    });

    Single<RedData> redObservable = Single.create(singleSubscriber -> {
        if (RedDataProcessor.isDataValid(myRedData)) {
            singleSubscriber.onSuccess(RedDataProcessor.process(myRedData));
        }
        else {
            singleSubscriber.onError(new RedDataIsInvalidThrowable());
        }
    });

    Single<PurpleData> composedSingle = Single.zip(blueObservable, redObservable,
            (blueData, redData) -> PurpleGenerator.combine(blueData, redData));

我还有以下订阅:

    blueObservable.subscribe(
            result -> {
                saveBlueProcessStats(result);
            },
            throwable -> {
                logError(throwable);
            });

    redObservable.subscribe(
            result -> {
                saveRedProcessStats(result);
            },
            throwable -> {
                logError(throwable);
            });


    composedSingle.subscribe(
            combinedResult -> {
                savePurpleProcessStats(combinedResult)
            },
            throwable -> {
                logError(throwable);
            });

我的问题: 蓝色&amp;红色数据被处理两次,因为两个订阅再次运行,我订阅了使用Observable.zip()创建的组合observable。

如果不同时运行两个操作,我怎么能有这种行为?

1 个答案:

答案 0 :(得分:2)

1.x中的Single无法做到这一点,因为没有ConnectableSingleSingle.publish的概念。您可以通过2.x和RxJava2Extensions库实现效果:

SingleSubject<RedType> red = SingleSubject.create();
SingleSubject<BlueType> blue = SingleSubject.create();

// subscribe interested parties
red.subscribe(...);
blue.subscribe(...);

Single.zip(red, blue, (r, b) -> ...).subscribe(...);

// connect()
blueObservable.subscribe(blue);
redObservable.subscribe(red);