Страницы

Поиск по вопросам

воскресенье, 7 июля 2019 г.

Как выполнить метод после нескольких запросов?

Хотел бы реализовать: По нажатию кнопки происходит загрузка информации с API и добавление (Если пустая)/обновление (Если заполненная) этой информации в базу данных.
Более подробно: Использую Retrofit для запросов и БД на SQLLite. Насколько я понял, нужно использовать фоновый асинхронный поток после нажатия кнопки и там загружать данные и заполнять\обновлять БД. Много читал похожих вопросов, везде советуют RxJava, сидел разбирался в RxJava, принцип понял, как он устроен, но примера для нескольких запросов не нашел.
Думал, сначала что все будет обновляться в UI потоке (приложение все равно не имеет практической ценности без БД), а потом подумал, что пусть оно там само обновляется в фоне, а потом какой-нибудь Toast вылезет, мол удачно все прошло. Так логичнее.
В общем, вот код образно:
api.getTransportTypes(JSON).enqueue(new Callback>() {...}; api.getMarshes(JSON).enqueue(new Callback>() {...}; api.getStops(JSON).enqueue(new Callback>() {...}; ...
Log.d("MainActivity", "Data from Api downloaded.");
UpdateDB();
Log.d("MainActivity", "Data Base updated.");
Вопрос: Как мне объединить и выполнить все запросы в API, а после, что бы вызвался метод, по окончанию загрузки, например образный - UpdateDB();?
Если можно какой-нибудь актуальный пример? С сегодняшними фреймворками? На RxJava или может какой-то способ через AsyncTask, Handler, Loader? Или алгоритм, хотя бы подробный (Хотя без кода все равно не понятно будет, наверное).


Ответ

Заюзать rx, как вариант, можно так:
1) Реализовать запросы через RxJava
Добавить .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) к Retrofit.Builder() Поменять методы в сервис интерфейсе @GET("url") fun getStops(): Flowable>
2) Применить zip к полученным flowable
Flowable.zip(api.getMarshes(), api.getStops(), api.getTransportTypes(), Function3, List, List, Triple, List, List>> { marshes, stops, transportTypes -> Triple(marshes, stops, transportTypes) }) .flatMapCompletable { insertToDb(it) }
Zip отправит запросы параллельно, дождется всех ответов и заэмитит дальше
3) Записать в базу
fun insertToDb(triple: Triple, List, List>): Completable { return Completable.fromCallable { database.insert(triple.first) database.insert(triple.second) database.insert(triple.third) } }
Если ваша БД поддерживает rx, то Flowable.fromCallable можно избежать PS код на kotlin

Комментариев нет:

Отправить комментарий