2015-09-28 3 views
5

私のプロジェクトでは、オブジェクトを別のスレッドで処理する必要があります。ストリームの動作を操作するために、私は彼らのobserveOn()このように変更し、新たな観測を作成します。スレッドを効率的に操作するRxJava

apiService.getObjects(token) // Retrofit 
       .compose(bindToLifecycle()) 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .doOnNext(o -> { 
        // process in Main Thread 
       }) 
       .map(Observable::just) // create new one, to change thread for it 
       .observeOn(Schedulers.io()) 
       .subscribe(o -> { 
        // process in the background thread 
       }); 

をしかし、私はRxJavaに異なるスレッドで1つの応答を処理するために、はるかに美しく、効率的な方法があると思います。私はそれをGoogleにしようとしましたが、何も見つかりませんでした。

おかげで、Rxので
アントン

答えて

3

は、通常、(ストリームが上で加入取得した場合にのみ実行されます)「行う」ブロックでの副作用を回避することをお勧めします、とコードを購読好むです。

あなたのケースでは、あなたが例えば、cache()またはpublish()...connect()を活用することができます:publish()の代わりcache()

query = apiService.getObjects(token) 
      .compose(bindToLifecycle()) 
      .subscribeOn(Schedulers.io()) 
      .cache(); 

query.observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(o -> { 
       // process in Main Thread 
      }) 
query.observeOn(Schedulers.io()) 
      .subscribe(o -> { 
       // process in the background thread 
      }); 

、コードは同じですが、あなたはにストリームを接続ことにより、クエリを発射する際に決めることができます( 2つのサブスクリプションを結んだ後にquery.connect()と呼んでください)。

サブスクリプションワークがバックグラウンド計算の場合は、がSchedulers.io()よりも優先される場合があります。 「observeOn」ステートメントのみの計算作業を行う方法(前の「行う」文ではなく)

+0

さらに下流に影響を与えるようにコードをAFAICT

注、map(Observable::just)ラインなしでうまく動作するでしょうか?そしてpublish - > connectの説明ができますか? –

+0

これらの2つの質問をカバーする答えを更新しました – Gluck

関連する問題