繁体   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