2017-11-21 9 views
-1

私はRxJavaを学んでいて、RxJavaの仕組みについての私の誤解であることは間違いありません。私は単純なObservableConsumerのペアを示す2つのコードブロックを持っています。Observableは1から4までの整数の計数ストリームをそれぞれ1秒遅らせて出力します。RxJava:単純な非同期操作の違いを理解する

スニペットA - UIの凍結

Observable<Integer> observable = Observable.create(e -> { 
    e.onNext(1); 
    Thread.sleep(1000); 
    e.onNext(2); 
    Thread.sleep(1000); 
    e.onNext(3); 
    Thread.sleep(1000); 
    e.onNext(4); 
    Thread.sleep(1000); 
    e.onComplete(); 
}); 
observable.subscribeOn(Schedulers.io()); 
observable.observeOn(AndroidSchedulers.mainThread()); 
observable.subscribe(i -> Log.e(TAG, "onNext: " + i)); 

スニペットB原因 - スニペットAは私のUIが、スニペットを凍結しない理由私は理解していない問題がある正しく

Observable.create(e -> { 
    e.onNext(1); 
    Thread.sleep(1000); 
    e.onNext(2); 
    Thread.sleep(1000); 
    e.onNext(3); 
    Thread.sleep(1000); 
    e.onNext(4); 
    Thread.sleep(1000); 
    e.onComplete(); 
}) 
.subscribeOn(Schedulers.io()) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(i -> Log.e(TAG, "onNext: " + i)); 

に動作しますBは期待どおりに動作し、バックグラウンドで動作します。このコードはButtononClickから実行され、スニペットBが完全に正常に動作している間にリップルアニメーションが停止するため、スニペットAはUIをフリーズさせることができます。

質問:Observableのインスタンス/ポインタを作成し、Observableを初期化するためにビルダーのパラダイムを使用しての違いは何ですか?上記の2つのコードスニペットが実際に異なるのはなぜですか?

+0

、私は簡潔なコードで約求めている明確な質問や問題がないのですか? – Brian

答えて

2

というコンセプトのためです。の連鎖です。

​​3210

Observable<Integer> observable = Observable.create(e -> { 
    e.onNext(1); 
    Thread.sleep(1000); 
    e.onNext(2); 
    Thread.sleep(1000); 
    e.onNext(3); 
    Thread.sleep(1000); 
    e.onNext(4); 
    Thread.sleep(1000); 
    e.onComplete(); 
}); 
Observable ioSubscription = observable.subscribeOn(Schedulers.io()); 
Observable mainThreadObservable = ioSubscription.observeOn(AndroidSchedulers.mainThread()); 
mainThreadObservable.subscribe(i -> Log.e(TAG, "onNext: " + i)); 

チェーン演算子

になりますすべてのオペレータがその効果を持っているであろう、観察を返します、あなたは効果を見るために、前の手順で返された新しい観測可能に加入する必要がありますほとんどの演算子はObservableで動作し、Observableを返します。これにより、チェーン内でこれらの演算子を順番に適用することができます。チェーン内の各演算子は、前の演算子の演算結果であるObservableを変更します。

ビルダーパターンのような他のパターンがあります。このパターンでは、特定のクラスのさまざまなメソッドが、メソッドの操作を通じてそのオブジェクトを変更することによって、同じクラスのアイテムに作用します。これらのパターンでも、同様の方法でメソッドを連鎖させることができます。しかし、Builderパターンでは、チェーン内に表示されるメソッドの順序は通常問題ではなく、Observable演算子は問題を順序付けます。

Observable演算子のチェーンは、チェーンを起点とする元のObservableでは独立して動作しませんが、チェーン内の直前の演算子によって生成されたObservable上でそれぞれ動作します。

参考:なぜ人投票ダウン時々私は理解していないObservable

+0

素晴らしい、ありがとう、それはあなたがそれを指摘したので、完全に意味がある! – Brian

関連する問題