[英]rxJava debounce() operator not working with Observable.range()
[英]Observable.merge and debounce in RxJava
这是我的代码:
package com.example.myapplication;
import io.reactivex.Observable;
public class SampleRx {
Observable<String> getBoth() {
return Observable.merge(getSeq1(), getSeq2());
}
Observable<String> getSeq1() {
return Observable.create(emitter -> {
emitter.onNext("A");
Thread.sleep(1_500);
emitter.onNext("B");
Thread.sleep(500);
emitter.onNext("C");
Thread.sleep(250);
emitter.onNext("D");
Thread.sleep(2_000);
emitter.onNext("E");
// Thread.sleep(2_000);
emitter.onComplete();
});
}
Observable<String> getSeq2() {
return Observable.create(emitter -> {
Thread.sleep(200);
emitter.onNext("1");
Thread.sleep(500);
emitter.onNext("2");
Thread.sleep(400);
emitter.onNext("3");
Thread.sleep(300);
emitter.onNext("4");
Thread.sleep(1_800);
emitter.onNext("5");
emitter.onComplete();
});
}
}
这是输出:
val=A
val=D
val=4
val=5
为什么会有5
而E
被忽略(因为我猜它后面跟着onComplete()
)。
运行代码:
SampleRx().getBoth().subscribe(System.out::println);
我得到:
A
B
C
D
E
1
2
3
4
5
这是正确的行为,因为将对所有发射使用调用/相同线程,因此结果将不会交错,并且merge
仅在两个Obervables信号都完成时才完成。
为了实现合并的交织,每个Observable
需要在不同的线程上运行,因此它们不会彼此阻塞,因此,如果每个Observable
都在io
上订阅,即
Observable.<String>create(emitter -> {
emitter.onNext(value);
...
...
emitter.onComplete();
}).subscribeOn(Schedulers.io());
然后您得到以下输出:
A, Thread : RxCachedThreadScheduler-1
1, Thread : RxCachedThreadScheduler-2
2, Thread : RxCachedThreadScheduler-2
3, Thread : RxCachedThreadScheduler-2
4, Thread : RxCachedThreadScheduler-2
B, Thread : RxCachedThreadScheduler-1
C, Thread : RxCachedThreadScheduler-1
D, Thread : RxCachedThreadScheduler-1
5, Thread : RxCachedThreadScheduler-2
E, Thread : RxCachedThreadScheduler-1
这样,它们就可以尊重不会相互阻塞的独立排放物。
您尚未提供标题中包含的有关防跳动的任何信息,因此我无法发表评论。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.