RxJava2压缩两个数据源完成后如何做一些操作

时间:2018-12-18 10:59:45

标签: java rx-java2

我正在处理两个单声道wav文件,我想将它们另存为立体声文件。 每个单声道的流式传输和订阅如下。 单声道数据可以具有不同的长度。 我使用zip运算符来处理对。 问题是我必须打电话:

fileWriter.stopRecord();

当完成两个数据的处理时。 所以我想用zip onCompleted方法来完成它,但是它不起作用,因为 处理完一个单声道后(调用onCompleted),它将调用zip onCompleted,但另一个单声道仍在处理中。 那么,如何确保在处理两个单声道之后调用zip onCompleted?一对值可以为null没关系。

        Observable<HermesMessages.AudioChunk> speakerAudioObservable = this.channel.getSpeakerAudio();

        speakerAudioObservable.subscribe(
                sample -> {
                    log.trace("Processing speaker !!!" );
                },
                error -> {
                    log.error("Error during writing to file", error);
                }, () -> {
                    log.trace("Completed writing speaker audio to file.");
                });

        Observable<HermesMessages.AudioChunk> dronAudioObservable = channel.getDronAudio();
        dronAudioObservable.subscribe(
                sample -> {
                    log.trace("Processing dron !!!" );

                },
                error -> {
                    log.error("Error during writing to file", error);
                },
                () -> {
                    log.trace("Completed writing dron audio to file.");
                });

        Observable.zip(speakerAudioObservable, dronAudioObservable, Pair::create)
                .subscribe(
                        pair -> {
                            fileWriter.streamSecData(pair.first().getContent());
                            fileWriter.workerJob();

                            fileWriter.streamData(pair.second().getContent());
                            fileWriter.workerJob();
                        },
                        error -> {
                            log.error("zip Error during writing to file", error);
                            fileWriter.stopRecord();

                        }, () -> {
                            log.trace("zip Completed writing speaker audio to file.");
                            fileWriter.stopRecord();
                        });

2 个答案:

答案 0 :(得分:0)

您无法使用zip来执行此操作,因为当压缩的一个可观察对象之一完成发射项目时,流就结束了。 (来源:http://reactivex.io/documentation/operators/zip.html)。

但是您可以使用另一个名为CombineLatest的运算符。它将一个可观察对象发射的一个项目与另一个可观察对象发射的最后一个项目组合在一起。缺点是您必须检查某个项目是否已经被“处理”(已经从该项目创建了一个配对)。因此,您必须更改Pair::create方法。也无需单独订阅每个可观察的对象。

来源:http://reactivex.io/documentation/operators/combinelatest.html

答案 1 :(得分:0)

我已经对一些整数进行了简单的解决方案测试 希望这个解决方案对您有帮助 2个大小不相同的整数流

 public void run(String... args) throws Exception {
    Observable<Integer> integerObservable1 = Observable.just(1, 2, 3,4);
    Observable<Integer> integerObservable2 = Observable.just(1, 2);

    runObservable(integerObservable1, integerObservable2)
    .map(o -> {
        System.out.println(o);
        return o;
    }).subscribe();
}

private Observable<Object> runObservable(Observable<Integer> integerObservable1, Observable<Integer> integerObservable2) {
    return Observable.merge(
            Observable.zip(integerObservable1, integerObservable2, (BiFunction<Integer, Integer, Object>) (integer, integer2) -> integer + " " + integer2),

            Single.zip(integerObservable1.toList(), integerObservable2.toList(), (integers, integers2) -> Math.min(integers.size(), integers2.size()))
                    .flatMapObservable(integer -> Observable.merge(integerObservable1.skip(integer), integerObservable2.skip(integer)))
                    .map(integer -> integer + " " + "static value")
    );
}

代码输出:

1 1

2 2

3静态值

4个静态值

由于流1有2个元素,流2有4个元素,我将其保留为静态,因为rxjava不支持null,但是您可以选择静态值可以为null还是最后一个值