Android Библиотека подкачки: IllegalStateExecption не может предоставлять результаты несколько раз - PullRequest
0 голосов
/ 27 мая 2020

Я использую Android Пейджинг для бесконечного списка

, но у меня есть проблема

  1. Мне нужно кэшировать свои данные в Room, получить их из API и отобразить в RecyclerView .

-> простейшее решение Dao, которое возвращает DataSource.Factory, он работает, но вот проблема, как получать данные на страницах из api, а не извлекать и кэшировать все данные сразу

-> Я пробовал BoundaryCallback, но, похоже, он предоставляет последний элемент и хочет загрузить больше элементов. Он также вызывается, только если я прокручиваю до конца списка, поэтому, если у меня есть кэшированные элементы в базе данных, он не обновляет sh их при прокрутке, а запрашивает больше данных, когда в списке больше нет данных -> здесь возможно, я мог бы написать собственный источник данных, который извлекает данные на страницах из комнаты, а затем граничная фабрика будет называться

-> поэтому я решил написать собственный источник данных и использовать PositionalDataSource a, который я только что смещал, ограничиваю пару, чтобы получить больше данных

У меня есть метод репозитория loadActivities (offset, limit) , который возвращает List<Activity> из базы данных Room, затем выполняет запрос api и возвращает обновленные данные, сохраняя их в Room.

Итак, в моем DataSource я попытался использовать это для загрузки страниц, и вот проблема, которую я получаю 1) Кэшированные данные и вызов callback.onResult (data) 2) Обновленные данные и вызов callback.onResult (data) < - Проблема в том, что IllegalStateException onResult () не может быть вызван несколько раз

У меня обычно что-то вроде этого

GlobalScope.launch {
            repo.loadActivitiesOf(settings.companyId, offset, limit)
                .collect {
                    networkError.send(it.error)

                    when (it.status) {
                        Resource.Status.SUCCESS -> {
                            callback( it.data ?: listOf() )
                            isLoading.send(false)

                            cancel()
                        }
                        Resource.Status.LOADING -> {
                            it.data?.let { callback( it ) }
                            isLoading.send(true)
                        }
                        Resource.Status.ERROR -> {
                            isLoading.send(false)

                            cancel()
                        }
                    }
                }
        }

Могу ли я как-то аннулировать это, если появятся новые данные?

Другое решение, которое я пробовал, - это дождаться возврата данных с сервера, но тогда у меня есть задержка, и я хочу отобразить кэшированные данные сразу после 1-2 se c refre sh это с новым данные с сервера.

...