我目前正在学习如何使用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));
答案 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()
之前。建议不要执行此步骤,因为最终会阻止前台线程。