Хотел бы реализовать: По нажатию кнопки происходит загрузка информации с 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
Zip отправит запросы параллельно, дождется всех ответов и заэмитит дальше
3) Записать в базу
fun insertToDb(triple: Triple, List
Если ваша БД поддерживает rx, то Flowable.fromCallable можно избежать
PS код на kotlin
Комментариев нет:
Отправить комментарий