Недостаточно памяти с комнатой и RxAndroid - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь загрузить кучу элементов в мое приложение для 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* надеюсь, вы мне поможете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...