繁体   English   中英

RxJava与用户创建的Flowable合并只发出最后一个Flowable

[英]RxJava merge with user created Flowable only emit the last Flowable

当我在由Flowable.create()创建的两个Flowable(a1,a2)上使用Flowable.merge()时,它只会发出a2。 但是当我合并由Flowable.interval()创建的两个Flowable(b1,b2)时,它将按照我的预期发出b1和b2。 所以我的问题是为什么这两个方法(创建和间隔)导致两个不同的结果流?

这是我的问题的简单演示:

public class MergeProblem {

    private static FlowableEmitter<Integer> emitter;

    public static void main(String[] args) throws Exception {

        Flowable<Integer> a = Flowable.create(emitter -> 
            MergeProblem.emitter = emitter, BackpressureStrategy.BUFFER);

        Flowable<String> a1 = a.map(x -> "a1 " + x);
        Flowable<String> a2 = a.map(x -> "a2 " + x);

        Flowable<Long> b = Flowable.interval(1, TimeUnit.SECONDS);
        Flowable<String> b1 = b.map(x -> "b1 " + x);
        Flowable<String> b2 = b.map(x -> "b2 " + x);

//        Flowable<String> c1 = Flowable.interval(1, TimeUnit.SECONDS)
//            .map(x -> "c1 " + x);
//        Flowable<String> c2 = Flowable.interval(1, TimeUnit.SECONDS)
//            .map(x -> "c2 " + x);

        Flowable.merge(Arrays.asList(a1, a2, b1, b2/*, c1, c2*/))
           .subscribe(System.out::println);

        AtomicInteger counter = new AtomicInteger(0);
        new Timer().scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                emitter.onNext(counter.getAndIncrement());
            }
        }, 0, 1000);

        Thread.sleep(10000);
    }
}

所以输出将是这样的:

a2 0
a2 1
b1 0
b2 0
b2 1
a2 2
...

它与Observable也有同样的问题。

区别在于:

emitter -> MergeProblem.emitter = emitter

你通常没有理由从create偷偷出发射器,并且给出两个不同的subscribe()调用,最新的一个将覆盖MergeProblem.emitter ,因此你只有最后一个订阅者可以MergeProblem.emitter交谈。

看起来你应该使用PublishProcessor ,它会向一个Subscriber发送一个onNext

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM