2017-10-31 15 views
0

下流上流にサブスクライブする前にdoOnSubscribeを呼び出すために、コード印刷1、RxJava1、2つのコードの印刷の両方において2RxJava2 doOnSubscribeが混乱した順序で実行されるのはなぜですか?

Observable.just(1) 
    .doOnSubscribe(d -> System.out.println(1)) 
    .doOnSubscribe(d -> System.out.println(2)) 
    .blockingSubscribe(); 

そして、この印刷2,1

Observable.just(1) 
    .doOnSubscribe(d -> System.out.println(1)) 
    .subscribeOn(Schedulers.newThread()) 
    .doOnSubscribe(d -> System.out.println(2)) 
    .blockingSubscribe(); 

"2,1" を後。

RxJava2では、サブスクリプションの前にアップストリームからダウンストリーム(Observer.onSubscribe)のサブスクリプションが発生しますが、まだdoOnSubscribeが呼び出されています。だから混乱した命令が発生した。

でも、私はもっと混乱し、状況与えることができます:私が期待したが、ほとんどのは期待できないとして、それは "3、4、1、2を" 印刷

Observable.just(1) 
    .doOnSubscribe(d -> System.out.println(1)) 
    .doOnSubscribe(d -> System.out.println(2)) 
    .subscribeOn(Schedulers.newThread()) 
    .doOnSubscribe(d -> System.out.println(3)) 
    .doOnSubscribe(d -> System.out.println(4)) 
    .blockingSubscribe(); 

を。

この動作は仕様ですか?はいの場合、どのようなメリットがありますか?タイムアウト前に高価な準備をしている非同期ソースを考える -

答えて

1

subscribeOnは、指定されたスレッドではなく取り消しをサポートするためにチェーンを新たに購読を開始し、それは最初に早い段階でキャンセルすることができDisposableonSubscribeを呼び出す必要がありますそれはonSubscribeを呼び出します。理論的には、3、4、1、2の間であらゆる種類のインタリーブを得ることも可能です。

+0

ええ、なぜそれが起こったのか分かります。私の質問は、なぜRxJava2はRxJava1のようにdoOnSubscribeを呼び出すことで、下流にサブスクライブした後には呼び出されないということです。もっと合理的な '4,3,2,1'を得ることができるように。 –

+0

RxJava 1には 'onSubscribe'がなく、' subscribe'が呼び出されたときに実行コードに制限されていました。 RxJava 2の主な目標は、v1のアーキテクチャ上および論理上の間違いを修正し、完全なバージョンのバンプにすることです。バイナリ互換性のない方法で行います。 – akarnokd

+0

ありがとうございます。私はあなたがこれが設計によるものであると言いたいのですか?私は 'doOnSubscribe'を使用して、おそらくオペレータを注文して購読注文によってその行動を行うように注意します。 –

関連する問題