簡體   English   中英

RxJava中的Observable.merge和去抖動

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

為什么會有5E被忽略(因為我猜它后面跟着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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM