Цеповые запросы в Retrofit + RxJava

У меня есть 2 API, которые я хочу сделать в последовательности и хранить их в SQLite.

Сначала я хочу сделать запрос к API A и сохранить его данные в таблице SQL a . Затем выполните запрос API B и сохраните его данные в таблице b и некоторые данные в таблице a_b . Данные, хранящиеся в a_b поступают только от запроса B

Как это сделать, используя RxJava. Я где-то читал об использовании flatMap для этого, что-то вроде этого

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

Если бы я не использовал лямбда-функции, это выглядело бы уродливым, как обычные вложенные вызовы. Это лучший способ сделать это?

Я не думаю, что использование оператора map – лучший способ пойти с такими вещами, как сохранение результата вызова api.

Мне нравится делать это в doOnNext . Таким образом, ваш пример будет примерно таким:

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

(Добавьте необходимое observeOn и subscribeOn сами, точно так, как вам нужно)

Да, вы можете использовать flatmap для этой цели. См. Приведенный ниже пример (Предполагая, что ваша служба A возвращает Observable<FooA> а служба B возвращает 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 } }); 
Intereting Posts
Как получить документы в каталоге Android, которые PhoneGap увидит Как программно изменить контрастность растрового изображения в андроиде? LinearLayout: layout_gravity = "bottom" не работает на горизонтальном LinearLayout Может ли APK быть повторно упакован после незначительного редактирования текста? Откройте изображение, используя URI в средстве просмотра изображений галереи по умолчанию в Android Удаление меток точек из линейной диаграммы с использованием библиотеки MPAndroidChart Как отправить KeyEvents через службу метода ввода в диалоговое окно или в меню Spinner? Android HKXM Android SDK отключен после установки Hyper V Внедрение HeartBeat в инфраструктуре атмосферы (Android) Изменение кнопок действий в уведомлении Установка ширины TextView в java Получение идентификатора RawContact с использованием идентификатора контакта Правильно переопределить параметры proguard Отключить просмотр списка Android «синий» фон Что такое префикс `abc` на полях R.dimen?