2017-09-14 5 views
0

J'apprends actuellement à utiliser RxJava et je veux calculer les données récupérées à partir de la base de données, puis les calculer de manière asynchrone, mais attendez que toutes ces données soient calculées.En attente de Observable abonnez-vous pour terminer

List<Data> list = getDatasFromDatabase(); 

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

// Here all Datas are computed 
return list; 

Comment puis-je faire de ce blocage:

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

Répondre

0

Vous pouvez utiliser l'opérateur toBlocking() pour créer un BlockingObservable. Cependant, je ne sais pas où et pourquoi vous en avez besoin? Si compute() est une méthode synchrone, votre première solution fera tout ce dont vous avez besoin, car elle traitera chaque élément, un à la fois, et sera terminée lorsque le dernier compute() sera terminé.

Si au contraire, vous voulez compute() à faire de manière asynchrone, vous voudrez peut-être:

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

Si vous avez besoin doSomethingWith() à faire de manière synchrone avec le code environnant, vous pouvez l'opérateur toBlocking() juste avant le subscriber(). Cette étape n'est pas recommandée, car vous finirez par bloquer le thread de premier plan.