Rx java RxJava异步观察程序未命中元素
我使用observeOn来观察另一个线程中的可观察对象:Rx java RxJava异步观察程序未命中元素,rx-java,Rx Java,我使用observeOn来观察另一个线程中的可观察对象: Observable.just("Hello", "world!").observeOn(Schedulers.io()).subscribe(System.out::println); 但是,此代码并不总是输出“Hello world!”。同样的情况也发生在出版主题上: PublishSubject<String> subject = PublishSubject.create(); subject.observeOn(S
Observable.just("Hello", "world!").observeOn(Schedulers.io()).subscribe(System.out::println);
但是,此代码并不总是输出“Hello world!”。同样的情况也发生在出版主题上:
PublishSubject<String> subject = PublishSubject.create();
subject.observeOn(Schedulers.io()).subscribe(System.out::println);
subject.onNext("Hello");
subject.onNext("world!");
PublishSubject=PublishSubject.create();
subject.observeOn(Schedulers.io()).subscribe(System.out::println);
subject.onNext(“你好”);
subject.onNext(“世界!”);
为什么这段代码不总是打印“Hello world!”?我认为至少在第二个示例中,subscribe会同时收到这两条消息,因为它在onNext调用之前订阅。是否有办法同时接收这两条消息?IO调度程序需要一些时间准备就绪
使用onNext发射项目时,它尚未准备就绪,因此您错过了它 RxJava调度器底层的线程都是守护进程线程,如果所有其他非守护进程线程都已完成,JVM将停止这些线程。如果从
static void main()
运行示例,则main()
方法很可能会在其他线程有机会运行之前终止,因此不会执行打印代码
根据您想要观察序列的方式,您可以在可观察链上使用
toBlocking()
,或者在onCompleted()
方法实现中使用CountDownLatch
和countDown()
。您真的想在这里使用Schedulers.io()吗?根据文档,它应该只用于IO操作,如文件读取或网络。从根本问题的角度来看,IO()的使用是无关的。它用于阻塞操作,通常是IO,但没有任何东西可以阻止您对其进行计算。这个答案有点误导:如果给予足够的时间,他们将处理onNext而不会丢失数据,但是示例程序在处理之前退出。谢谢,这确实是个问题!我使用CountDownLatch来防止该问题。然而,我不确定我是否理解toblock的语义。这会使调用线程阻塞直到调用onCompleted吗?BlockingObservable上的方法在当前线程上执行,本质上是阻塞的。一些穷举方法会一直阻塞,直到上游终止为onComplete或onError。