4 votes

Comment se débarrasser des flux imbriqués de RxJava ?

J'ai une chaîne d'appels à l'Internet, à la base de données et, comme résultat, je montre les informations collectées à l'utilisateur. Maintenant, j'ai un flux RxJava imbriqué à 3 niveaux très laid. Je veux vraiment le rendre lisse et facile à lire, mais j'ai eu beaucoup de mal.

J'ai déjà lu tout ce qui concerne Map, flatMap, zip, etc. Je n'arrive pas à faire fonctionner les choses ensemble.

Code : faire un appel api. Les informations reçues sont placées dans la base de données et souscrivent à un autre flux dans la méthode onSuccess du premier flux, et dans la méthode onSuccess du second flux reçu de la base de données, les informations sont finalement affichées à l'utilisateur.

Dat Frankenstein :

disposables.add(modelManager.apiCall()
                .subscribeOn(Schedulers.io())
                .observeOn(mainThread)
                .subscribeWith(new DisposableSingleObserver {

                  public void onSuccess(ApiResponse apiResponse) {

                        modelManager.storeInDatabase(apiResponse)
                       //level 1 nested stream:
                        disposables.add(modelManager.loadFromDatabas()
                                  .subscribeOn(Schedulers.io())
                                  .observeOn(mainThread)
                                  .subscribeWith(new DisposableSingleObserver{
                                    public void onSuccess(Data data) {
                                        view.showData(data);
                                    }
                                    public void onError(Throwable e) {
                                    }
                                }));
                    }
                    @Override
                    public void onError(Throwable e) {
                    }
                }));
    }

3voto

Zhuinden Points 3074

J'ai déjà lu tout ce qui concerne Map, flatMap, zip, etc. Je n'arrive pas à faire fonctionner les choses ensemble.

Eh bien, vous avez manqué quelque chose à propos de flatMap parce que c'est à cela que ça sert ;)


disposables.add(
    modelManager.apiCall()
        .subscribeOn(Schedulers.io())
        .doOnSuccess((apiResponse) -> {
            modelManager.storeInDatabase(apiResponse)
        })
        .flatMap((apiResponse) -> {
            modelManager.loadFromDatabase()
        })
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe((data) -> {
            view.showData(data);
        })
);

Mais si vous utilisez une couche de base de données réactive comme celle de Room LiveData<List<T>> vous pouvez alors vous débarrasser de la modelManager.loadFromDatabase() partie.

3voto

user9335240 Points 1204

flatMap signifie convertir le résultat d'un flux en un autre flux, c'est probablement ce que vous voulez.

Parce que vous avez un Observable qui émet un ApiResponse alors vous avez une autre "source de Observable s" qui prend cette ApiResponse et en donne un autre Observable que vous voulez observer.

Il est donc probable que vous vouliez quelque chose comme ça :

disposables.add(modelManager.apiCall()
            .flatMap(apiResponse -> {
                         modelManager.storeInDatabase(apiResponse);
                         return modelManager.loadFromDatabas()
                     })
            .subscribeOn(Schedulers.io())
            .observeOn(mainThread)
            .subscribeWith(new DisposableSingleObserver {

              public void onSuccess(ApiResponse apiResponse) {
                  view.showData(data);
              }
              public void onError(Throwable e) {
              }
            })

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X