等待Observable订阅完成

时间:2017-09-14 13:09:53

标签: rx-java

我目前正在学习如何使用RxJava,我想计算从数据库获取的数据,然后异步计算它们,但等待计算所有这些数据。

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));

1 个答案:

答案 0 :(得分:1)

您可以使用toBlocking()运算符创建BlockingObservable。但是,我不清楚你需要它的地点或原因?如果compute()是同步方法,那么您的第一个解决方案将执行您需要的所有操作,因为它将一次处理每个项目,并在最后compute()完成时完成。

相反,如果您想要异步完成compute(),那么您可能需要:

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

如果您需要doSomethingWith()与周围的代码同步完成,toBlocking()运算符就在subscriber()之前。建议不要执行此步骤,因为最终会阻止前台线程。