Я пытаюсь загрузить кучу элементов в мое приложение для Android, используя Rx и Room, мне нужно сделать большой запрос, чтобы получить следующий элемент ID для загрузки, а затем сделать новый вызов с этим идентификатором и получитьэлемент, снова и снова.
Первый вызов, чтобы получить список ITEM_ONE
- Сохранить локально
* Второй вызов, чтобы получить список ID ITEM_TWO (по идентификатору ITEM_ONE)
*** Третий звонок, чтобы получить ITEM_TWO по идентификатору (один за другим)
*** - Сохранить локально -
**** Четвертый звонок, чтобы получить ITEM_THREEСписок ID (по идентификатору ITEM_TWO)
***** Пятый звонок, чтобы получить ITEM_THREE по идентификатору (один за другим)
***** - Сохранить локально -
****** Шестой звонок, чтобы получить список ID ITEM_FOUR (по идентификатору ITEM_THREE)
******* Седьмой звонок, чтобы получить идентификатор ITEM_FOUR по идентификатору (один за другим)
******* - Сохранить локально -
******** Восьмой звонок для получения списка ITEM_FIVE ID (по идентификатору ITEM_FOUR)
********* Девятый звонок, чтобы получить ITEM_FIVE по идентификатору (один за другим)
********* - Сохранить локально -
Я пытаюсь использовать Rx с вызовами, у меня есть (домен и модули данных) класс Api, Repository, UseCase, а также DataManager, Interactor, Presenter, поэтому есть Api с запросом на модернизацию, репозитории для запросаудаленные данные и сохранение локальных данных, которые возвращают наблюдаемые, UseCases, которые реализуют методы репозитория, вызов DataManger UseCases для получения наблюдаемых (вызовы для получения удаленных и локальных данных, возвращающие Flowables и вызовы для вставки локальных данных, возвращающие Completables), Interactor используют DataManager (localи удаленный запрос) и докладчик выполняет всю логику.
В качестве общей демонстрации у меня есть следующие методы
Репозиторий (получение удаленных данных)
override fun getRemoteItem(syncId: String, id: String): Flowable<Item> {
return api.itemById(syncId, id)
.map(fun(itemModel: ItemModel): Item {
return itemModelObjectMapper.mapFrom(itemModel)
}
}
Вариант использования
override fun createObservable(data: Map<String, Any>?): Observable<Item> {
return itemRepository.getRemoteItem(
data!!.["syncId"] as String,
data.["id"] as String).toObservable()
}
DataManager
override fun getRemoteItem(data: Map<String, Any>?): Observable<Item>{
return appUseCase.getRemoteItem(data)
}
Interactor
override fun getItemById(syncId: String, id: String): Observable<Item>{
val mapData = HashMap<String, Any>()
mapData["syncId"] = synId
mapData["id"] = id
return dataManager.getRemoteItem(mapData)
}
Я хочу загрузить все данные, независимо от того, сколько времени это занимает, поэтому в настоящее время я следуюшаги
...
Observable.just(item_one_list)
.flatMapIterable {list -> list}
.flatMap(fun(item_one: ItemOne): Observable<List<ItemTwoIds>>{
return interactor.getItemTwoIds(SyncId, item_one.id)
})
.onErrorResumeNext(fun(t: Throwable): ObservableSource<List<ItemTwoIds>>{
return Observable.empty()
})
.flatMapIterable {list -> list}
.flatMap(fun(item_two_id: ItemTwoIds): Observable<List<ItemTwoModel>>{
return if (item_two_id.id == null){
Observable.empty()
} else {
return interactor.getItemTwoById(SyncId, item_two_id.id)
}
})
.toList()
.flatMapCompletable(fun(item_two_model: ItemTwoModel): Completable{
val mapData = HashMap<String, Any>
mapData["item"] = item_two_model
return interactor.insertAllItemTwo(mapData)
})
.andThen(interactor.getLocalItemTwoList())
.flatMapCompletable(fun(items_two: List<ItemTwoEntity>): Completable{
return Observable.just(items_two)
.flatMapIterable {list -> list}
.flatMap(fun(item_two: ItemTwo): Observable<List<ItemThreeIds>>{
return interactor.getItemThreeIds(SyncId, item_two.id)
})
.onErrorResumeNext(fun(t: Throwable): ObservableSource<List<ItemThreeIds>>{
return Observable.empty()
})
.flatMapIterable {list -> list}
.flatMap(fun(item_three_id: ItemThreeIds): Observable<List<ItemThreeModel>>{
return if (item_three_id.id == null){
Observable.empty()
} else {
return interactor.getItemThreeById(SyncId, item_three_id.id)
}
})
.toList()
.flatMapCompletable(fun(item_three_model: ItemThreeModel): Completable{
val mapData = HashMap<String, Any>
mapData["item"] = item_three_model
return interactor.insertAllItemThree(mapData)
})
.andThen(interactor.getLocalItemThreeList())
.flatMapCompletable(fun(items_three: List<ItemThreeEntity>): Completable{
return Observable.just(items_three)
.flatMapIterable {list -> list}
.... // same logic block to get ITEM_FOUR, and then ITEM_FIVE, etc, etc...
})
...
С этой всей работой я получаю локально сохранить все ITEM_ONE и все ITEM_TWO, но тогда яиз памяти.
ITEM_ONE_1
ITEM_ONE_2
ITEM_ONE_3
ITEM_ONE_4
ITEM_ONE_5
...
*** ITEM_TWO_item_one_1
*** ITEM_TWO_item_one_2
*** ITEM_TWO_item_one_2
*** ITEM_TWO_item_one_3
*** ITEM_TWO_item_one_4
----------------------------------------
Я хочу скачать
ITEM_ONE_1
*** ITEM_TWO_1_item_one_1
****** ITEM_THREE_1_item_two_1
********* ITEM_FOUR_item_three_1
****** ITEM_THREE_2_item_two_1
********* ITEM_FOUR_item_three_2
*** ITEM_TWO_2_item_one_1
1094 ******* ITEM_THREE_item_two_2 1096 ******* ITEM_THREE_item_two_2 1098 * ITEM_ONE_2 1100 **** ITEM_TWO_1_item_one_2 1102 ******* ITEM_THREE_item_two_1
*** ITEM_TWO_2_item_one_2
****** ITEM_THREE_item_two_2
****** ITEM_THREE_item_two_2
ITEM_ONE_3
*** ITEM_TWO_item_one_3
ITEM_ONE_4
*** ITEM_TWO_item_one_4
11 *1919* надеюсь, вы мне поможете