[英]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.