web-dev-qa-db-fra.com

Chaînage des demandes dans Retrofit + RxJava

J'ai 2 APIs que je veux faire une demande en séquence et stocker leurs données dans SQLite.

Je veux d'abord faire une demande à l'API A et stocker ses données dans la table SQL a. Faites ensuite une demande à l'API B et stockez ses données dans la table b et certaines données dans la table a_b. Les données stockées dans a_b provient uniquement de la demande B.

Comment puis-je faire cela en utilisant RxJava. J'ai lu quelque part sur l'utilisation de flatMap pour cela, quelque chose comme ça

apiService.A()
    // store in DB here? How? maybe use map()?
    .flatMap(modelA -> {
        // or maybe store modelA in DB here?
        return apiService.B().map(modelB -> {
            storeInDB()l // store B here ?
            return modelB;
        });
    });

Si je n'utilisais pas les fonctions lambda, cela aurait l'air aussi moche que les appels imbriqués normaux. Est-ce une meilleure façon de procéder?

19
Sourabh

Je ne pense pas que l'utilisation de l'opérateur map soit la meilleure façon d'aller avec des choses comme le stockage du résultat de l'appel api.

Ce que j'aime faire, c'est séparer ces choses à l'intérieur des opérateurs doOnNext. Donc, votre exemple serait quelque chose comme ceci:

apiService.A()
        .doOnNext(modelA -> db.store(modelA))
        .flatMap(modelA -> apiService.B())
        .doOnNext(modelB -> db.store(modelB));

(ajoutez vous-même observeOn et subscribeOn nécessaires, exactement comme vous en avez besoin)

22
Bartek Lipinski

Oui, vous pouvez utiliser le flatmap dans ce but précis. Voir l'exemple ci-dessous (en supposant que votre service A renvoie Observable<FooA> et le service B renvoie Observable<FooB>)

api.serviceA()
        .flatMap(new Func1<FooA, Observable<FooB>>() {
            @Override
            public Observable<FooB> call(FooA fooA) {
                // code to save data from service A to db

                // call service B
                return api.serviceB();
            }
         })
         .subscribeOn(Schedulers.io())
         .observeOn(AndroidSchedulers.mainThread())
         .subscribe(new Subscriber<FooB>() {
             @Override
             public void onCompleted() {
             }

             @Override
             public void onError(Throwable e) {

             }

             @Override
             public void onNext(FooB fooB) {
                 // code to save data from service B to db

             }
        });
21
Much Overflow