Observable<Object> obs1 = Observable
.create(subscriber -> subscriber.onNext("obs 1 event"))
.doOnSubscribe(() -> System.out.println("obs1 sub"))
.doOnUnsubscribe(() -> System.out.println("obs1 unsub"));
Observable<Object> obs2 = Observable
.create(subscriber -> subscriber.onNext("obs 2 event"))
.doOnSubscribe(() -> System.out.println("obs2 sub"))
.doOnUnsubscribe(() -> System.out.println("obs2 unsub"));
Observable
.amb(obs1, obs2)
.subscribe(System.out::println);
Thread.sleep(500);
应该调用obs2 doOn *方法,并且仅应发出两个事件中的一个。程序输出:
obs1 sub
obs 1 event
没有调用obs2的* subscribe方法。
答案 0 :(得分:1)
RxJava源和操作符默认情况下是同步的,除非它们使用调度程序引入异步。上面的代码均未涉及任何调度程序,因此执行将是同步的。 amb
不会尝试订阅第二个,因为第一个已经赢得了比赛。
当我将
just
替换为create时,它会像我期望的那样工作
just
产生不同结果的原因是背压,您在弃用的create
使用中并未实现该背压。 amb
首先订阅源,然后再订阅源的请求,这样您便获得了订阅的副作用。如果您的实现失败,则第一个来源会立即推送其项目,从而使amb
进入获胜状态,从而防止第二个订阅发生。