2017-09-14 28 views
0

私は現在RxJavaの使い方を学んでおり、データベースからフェッチされたデータを計算して非同期に計算したいが、すべてのデータが計算されるのを待っている。Observable Waiting for Observable subscribe to finish

List<Data> list = getDatasFromDatabase(); 

list.forEach(data -> compute(data)); // How can I make this async using RxJava ? 

// Here all Datas are computed 
return list; 

どのように私は、このブロックを行うことができます。

Observable.from(list).forEach(data -> compute(data)); 

答えて

0

あなたはBlockingObservableを作成するためにtoBlocking()演算子を使用することができます。しかし、どこで、なぜそれが必要なのかはっきりしていませんか? compute()が同期メソッドの場合、最初のソリューションは、各アイテムを一度に1つずつ処理し、最後のcompute()が終了した時点で終了するため、必要なすべてを行います。

代わり場合は、compute()が非同期で実行されるようにしたい、そして、あなたが必要になることがあります。

Observable.from(list) 
    .subscribeOn(backgroundThreadScheduler) 
    .flatMap(data -> Observable.fromCallable(d -> compute(d))) 
    .toList() 
    .observeOn(foregroundScheduler) 
    .subscribe(revisedList -> doSomethingWith(revisedList)); 

あなたは周囲のコードと同期して行われるdoSomethingWith()が必要な場合は、あなただけsubscriber()toBlocking()オペレータができます。フォアグラウンドスレッドをブロックすることになるので、この手順はお勧めしません。

関連する問題