RxJava异步观察者错过了元素

时间:2015-05-17 08:44:54

标签: rx-java

我使用observeOn来观察另一个线程中的一个observable:

Observable.just("Hello", "world!").observeOn(Schedulers.io()).subscribe(System.out::println);

但是这段代码不会总是输出" Hello world!"。 PublishSubject也是如此:

PublishSubject<String> subject = PublishSubject.create();
subject.observeOn(Schedulers.io()).subscribe(System.out::println);
subject.onNext("Hello");
subject.onNext("world!");

为什么这段代码并不总是打印出来&#34; Hello world!&#34; ?我认为,至少在第二个样本中,订阅将收到这两个消息,因为它在onNext调用之前订阅。有没有办法接收这两条消息?

2 个答案:

答案 0 :(得分:0)

IO调度程序需要一些时间准备就绪。

当您使用onNext发出项目时,它尚未就绪,因此您错过了它。

答案 1 :(得分:0)

RxJava调度程序底层的线程都是守护程序线程,如果所有其他非守护程序线程都已完成,它们将由JVM停止。如果从static void main()运行示例,则很可能在其他线程有可能运行之前,main()方法将终止,因此不会执行打印代码。

根据您希望观察序列的方式,您可以在Observable链上使用toBlocking(),或在CountDownLatch方法实现中使用countDown()onCompleted()。< / p>