2017-07-15 1 views
0

私はAndroidでRxJava2を使用していますが、私は以下の問題がありますが、Androidに固有の問題ではありません。Observableのすべてのイベントを1つのスレッドで処理する方法はありますが、Rxjavaの別のスレッドで最新の値を取得する方法はありますか?

私は全てのイベントをプッシュするためにPublishSubjectを持っています。異なるイベントに基づいて私のコードの複数の部分でpublishSubject.onNext()と呼んでいます。しかし、私はこれらのイベントを購読する私のコードの中心的な場所を持っています。以下のサブスクリプションコードされています。私はpublishSubject.onNext() 100回を呼び出す場合

publishSubject 
    .observeOn(Schedulers.computation()) 
    .map(
     // each computation takes about 10ms 
     // Do some computation and return a `computation` object 
    ) 
    .observerOn(AndroidSchedulers.mainThread()) 
    .subscribe(
     // take the `computation` object and draw on screen 
     // each drawing takes about 100ms 
    ); 

は今、上記の場合には、その後、computationを100回実行されますと、画面に描画することは100回行われます。

100倍の計算は気になります。すべてのイベントを計算する必要があります。しかし、すべての計算されたオブジェクトを描画する必要はありません。

最初のcomputationオブジェクトが画面上に描画されているときは、MAINスレッドで描画するのに100msかかるが、その時までに新しいcomputationオブジェクトがCOMPUTATIONスレッドで生成される。だから2回目に私は画面上に描画しますが、2番目のcomputationオブジェクトを描画するのではなく、最新のcomputationオブジェクト(おそらく11番目の計算オブジェクト)を描画します。要するに、私はすべての計算を常に行う方法を探していますが、その時点で利用可能な最新の計算オブジェクトのみを画面に描画します。

答えて

2

あなたはこれを試しましたか?

publishSubject 
.observeOn(Schedulers.computation()) 
.map(...) 
.toFlowable(BackpressureStrategy.LATEST) 
.observerOn(AndroidSchedulers.mainThread()) 
.subscribe(...); 

これにより、計算が実際に行われることが確認されますが、サブスクリプションはあまりにも時間がかかりすぎるアイテムを受信しません。

+3

ほぼ。 'observeOn(mainThread()、false、1) 'でプリフェッチを制限する必要があります。そうしないと、内部バッファに中間値が保存される可能性が高くなります。 – akarnokd

+0

@akarnokd +1 @ Tassosこれは私の問題を完全には解決しませんでしたが、私を「Flowable」に向けてくれてありがとう。これは私が探していたものです。 – Henry

+0

@akarnokd確かに、それを指摘してくれてありがとう。当初、私は 'toFlowable'を2番目のスケジューラースイッチに設定していましたが、その後、それらの無用なコンテキストスイッチにもかかわらず... –

関連する問題