2017-02-15 209 views
1

我与RX运营商乱搞,并很好奇,为什么just(null).repeat()不作为参数工作,任何内置的运算符:奇怪的行为

Observable.interval(1, TimeUnit.SECONDS) 
    .sample(Observable.just(null).repeat()) 
    .subscribe(System.out::println); 

我本来预计会打印0 1 2 3 ...但它只是挂起。我想这是因为repeat霸占了默认Scheduler,但是,如果你换的interval的角色和just-repeat然后它按预期工作,印刷null每秒一次:

Observable.just(null).repeat() 
    .sample(Observable.interval(1, TimeUnit.SECONDS)) 
    .subscribe(System.out::println); 

怎么回事请告诉我?

回答

3

如果您没有指定调度程序(并且没有操作员正在设置它),则所有的处理都发生在同一个线程上。 just(null).repeat()将占用CPU核心的100%,所以没有别的机会可以继续。

在你的情况下,interval被拿出了Scedulers.computation()计划程序,因为它是在开始和在此之后的调度变化发生,您的repeat也正在同一线程上。

在第二种情况下,除了在自己的调度程序上的区间之外,所有内容都在同一个线程上进行预订;其余依赖于sample的内部实施。

如果你使用特定的调度,它应该工作:

.sample(Observable.just(null).repeat().subscribeOn(Schedulers.computation())) 

注意,如果你只是想用空值,而不是说interval生成数字,一个更有效的方法是使用map代替sample

.map(any -> (Object) null) 
+0

ooooohh,这很有道理。我忘记了间隔默认为不同的调度程序。 D'哦! – flakes

+1

也看起来像重复可以把一个调度程序作为参数! '重复(Schedulers.computation())' – flakes