2016-08-05 4 views
0

Rx Androidが新しくなった。私はスロットルのようなオペレータを参照してください& debounce;私はそれを私のシナリオで効果的に使用する方法を理解することはできません。Rx Android:最後に計算された値を計算し返すために呼び出しをデバウンス

私のAPPではいくつかのスレッドが実行されているため、グローバルな状態がいくつか更新され、高価な計算を実行するよう要求されます。 計算を別のスレッドで実行する必要があります。呼び出し側スレッドは、Observableを使用して計算結果を受け取ります。

計算を実行するために、いくつかの連続呼び出しまたは並列呼び出しがあります。私は特定の期間に呼び出しをデバウンスしたいと思います。すべての呼び出し元は最後に計算された値を受け取る必要があります。

例: 3つのスレッドT1、T2、&が、500ミリ秒の期間内に計算を実行するように要求した場合、計算は1回だけ実行する必要があります。全てのスレッドT1、T2 & T3は、計算結果(Observer)を観測し、最後に計算された結果を取得します。

+0

非難してスイッチマップを? – EpicPandaForce

+0

あなたがしたいようなものですonTextChange listener ?? –

答えて

0

これは何か?

BehaviorSubject<Object> b = new BehaviorSubject(); 
Observable<T> computationChain = 
     b 
     .onSubscribe(() -> b.onNext(null)) 
     .debounce(500, TimeUnit.MILLISECONDS) 
     .observeOn(Schedulers.computation()) 
     .map(dummy -> performExpensiveComputation()) 
     .share(); 

.... 

public Observable<T> getComputation() { 
    return computationChain; 
} 

.... 

getComputationChain().subscribe(value -> doSomething(value)); 

編集:多分これは良い仕事します:

BehaviorSubject<Object> b = new BehaviorSubject(); 
Observable<T> computationChain = 
     b 
     .debounce(500, TimeUnit.MILLISECONDS) 
     .observeOn(Schedulers.computation()) 
     .map(dummy -> performExpensiveComputation()) 
     .publish(); 
     .onSubscribe(() -> b.onNext(null)) 
+0

行=> .onSubscribe(() - > b.onNext(null))を説明してください。ありがとう。 – user4231878

+0

つまり、誰かがサブスクライブすると、そのサブスクリプションイベントをbehaviorSubjectにトークン値(null)としてプッシュします。これは最後に無視されます(map()内)。 –

関連する問題