2017-02-15 15 views
1

私はRX演算子をいじりとjust(null).repeat()は、組み込み演算子のいずれかにパラメータとして動作しない理由を興味津々だ:奇妙な行動

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

Iこれは0 1 2 3 ...を印刷すると予想していましたが、それはちょうどハングアップします。ここで起こっていただきました

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

:私はあなたがintervaljust-repeatの役割を交換する場合に予想されるようしかし、それは1秒に1回nullを印刷し、働き、repeatはデフォルトSchedulerを占有されるからだと想像しますか?

答えて

3

スケジューラを指定しない場合(演算子を設定していない場合)、すべての処理は同じスレッドで行われます。 just(null).repeat()はCPUコアの100%を占有しますので、他に進める機会はありません。あなたのケースでは

は、intervalScedulers.computation()スケジューラに生成されます、そして、それは開始時だと何のスケジューラの変更はその後起こりませんので、ごrepeatも同じスレッドに取り組んでいます。

2番目のケースでは、すべてが同じスレッド上でサブスクライブされますが、インターバルは独自のスケジューラ上にあります。残りはsampleの内部実装に依存します。あなたが特定のスケジューラを使用している場合

、それが動作するはずです:

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

あなただけのヌルの代わりintervalが生成する番号を使用する場合は、はるかに効率的な方法は、代わりにmapを使用することであることに注意してくださいsample

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

ooooohhはそれほど意味があります。私は間隔のデフォルトを別のスケジューラに忘れてしまった。ああ! – flakes

+1

また、repeatのように見えるスケジューラをパラメータとして使うことができます! 'repeat(Schedulers.computation())' – flakes