![](/img/trans.png)
[英]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.