2017-02-10 47 views
1

我真的很新的Rx,只是想知道怎样的影响subscribeOnObservable顺序设置调度程序中的Rx

//This will not print anything 
Observable.just("whatever") 
     .flatMap { s -> Observable.just(s.length) } 
     .subscribeOn(Schedulers.newThread()) 
     .subscribe(::println) 

//This prints the length 
Observable.just("whatever") 
     .subscribeOn(Schedulers.newThread()) 
     .flatMap { s -> Observable.just(s.length) } 
     .subscribe(::println) 

的顺序是什么引擎盖下,为什么happend的?

回答

2

RxJava调度程序使用守护程序线程,如果Java的“主”线程退出,它可能会停止或根本不能运行。当我运行这两个设置时,有时候第二个不会打印任何东西,有时它会;你看到某件事情是随机的。

这实际上取决于newThread反应并执行上游代码的速度。对于第二种情况,由于它在主线程上发生了更长的一组订阅,执行在subscribe之后返回的时间,newThread可能有足够的时间触发打印。

如果你把Thread.sleep(1000)你会看到两个值都打印出来。

2

其实他们都打印结果。唯一的区别是时机。我相信这是对所观察行为的解释 - 在第一种情况下,flatMap直接订购了just的结果main线程和println在新线程上。产生一个新线程和println都是密集型操作需要时间来执行和main线程退出之前。

在第二种情况下,flatMap订阅了just上一个新的线程和println订阅了flatMapmain线程。因此,main线程被更多的占用,因为依赖后产生一个新的线程,我们看到main退出前的结果。

您可以尝试在最后一行中使用下面的代码执行相同的操作以查看差异。

Observable.timer(3, TimeUnit.SECONDS).toBlocking().subscribe();