RxJava合并可流动且可完成

时间:2019-01-15 08:40:41

标签: java rx-java2

我有一个Flowable,它会连续发射物品,并且从不调用onErroronComplete。现在,我有一个Completable,我想与此Flowable合并,以便在Completable完成Flowable调用onComplete时。我无法直接更改提供给我的Flowable对象。

我遇到的一个问题是我会在takeUntil上使用Flowable,但是Flowable可能会在任何时候停止发射物品,我仍然希望{{1} },以便可以调用Completable

更新: 由于我们可以做onComplete,所以我们可以合并两个Completable.toFlowable()。问题是,当一个完成时,我仍然找不到找到完成这两个方法的方法。

2 个答案:

答案 0 :(得分:2)

正如您所指出的,您无法更改原始Flowable本身,因此不会发出onComplete。但是,您可以通过执行以下操作(伪代码)来使结果Flowable发出它:

val f: Flowable = ...
val c: Completable = ...
val r: Flowable = f.materialize().mergeWith(c.materialize()).dematerialize()

答案 1 :(得分:0)

这是一个广义的解决方案。正如@Maxim的回答所述,merge / mergeWith无法完成我的功能,因为它需要同时完成FlowableCompletable。该解决方案还可以正确处理这两种情况。

    Flowable<Integer> f = Flowable.fromArray(1, 2, 3);
    Completable c = Completable.complete();

    final PublishSubject<Integer> subject = PublishSubject.create();
    final CompositeDisposable cd = new CompositeDisposable();
    Flowable result = subject
            .doOnSubscribe(__ -> {
                cd.add(f.subscribe(subject::onNext));
                cd.add(c.subscribe(subject::onComplete));
            })
            .doOnDispose(cd::dispose)
            .toFlowable(BackpressureStrategy.LATEST);