Rx java 无法测试rxjava的合并运算符

Rx java 无法测试rxjava的合并运算符,rx-java,Rx Java,我想使用rxjava 1测试merge操作符,使用: Observable<Object> o1 = Observable.create((t) -> { t.onNext("1"); try { Thread.sleep(5000); } catch (Exception e) { e.printStackTrace(); } t.onNe

我想使用rxjava 1测试
merge
操作符,使用:

    Observable<Object> o1 = Observable.create((t) -> {

        t.onNext("1");
        try {
            Thread.sleep(5000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        t.onNext("2");
        t.onCompleted();
    });

    Observable<Object> o2 = Observable.create((t) -> {
        t.onNext("a");
        t.onNext("b");
        t.onCompleted();
    });

    o1.mergeWith(o2).subscribe(System.out::println);
Observable o1=可观察。创建((t)->{
t、 onNext(“1”);
试一试{
睡眠(5000);
}捕获(例外e){
e、 printStackTrace();
}
t、 onNext(“2”);
t、 未完成();
});
可观察o2=可观察。创建((t)->{
t、 onNext(“a”);
t、 onNext(“b”);
t、 未完成();
});
o1.mergeWith(o2).subscribe(System.out::println);
我希望输出是:
1ab2
,但实际是
12ab


那么,为什么呢?

因为
merge
以同步方式订阅可观察对象。由于第一个可观察对象没有显式地将工作移动到后台线程,
create(…)
的主体也同步执行

这意味着,当订阅
o1
时,它必须在订阅下一个可观察对象之前在
create(…)
调用中完全完成主体

使用
subscribeOn(Schedulers.computation())
显式地在后台运行可观察对象可以解决这个问题


请参阅:有关调度程序的更多信息,因为
合并
以同步方式订阅可观察对象。由于第一个可观察对象没有显式地将工作移动到后台线程,
create(…)
的主体也同步执行

这意味着,当订阅
o1
时,它必须在订阅下一个可观察对象之前在
create(…)
调用中完全完成主体

使用
subscribeOn(Schedulers.computation())
显式地在后台运行可观察对象可以解决这个问题


请参阅:有关调度程序的更多信息

请注意,即使subscribeOn也可能不会产生预期的交织。请注意,即使subscribeOn也可能不会产生预期的交织。