Android Jetpack Paging - загрузка данных из сети и базы данных - PullRequest
0 голосов
/ 20 мая 2019

Моя цель - реализовать разбиение на страницы, когда каждая страница сначала отображается из базы данных, и одновременно из сети запрашивается одна и та же страница.
Я хочу решить эту проблему с использованием библиотеки подкачки.

Пока я вижу это следующим образом:

  1. База данных комнат возвращает «живые» данные пользователей, например:
@Query("SELECT * FROM user " +
             "WHERE id > :lastUserId " +
             "ORDER BY id ASC " +
             "LIMIT :pageSize")
fun getUsersPage(lastUserId: Long, pageSize: Int) Flowable<List<DBUser>> 

где lastUserId используется для определения начала страницы.

  1. Затем в репозитории я могу запросить каждую страницу из базы данных и сети и использовать объединенный результат:
fun getUsersPage(lastUserId: Long): Flowable<List<User>> {
    val localData = database.userDao().getUsersPage(lastUserId, USERS_PAGE_SIZE)
            .subscribeOn(AppSchedulers.computation())
            .map { DbUserMapper.mapTo(it) }

    val remoteData = retrofitService.getUsers(lastUserId, USERS_PAGE_SIZE)
            .subscribeOn(AppSchedulers.io())
            .observeOn(AppSchedulers.computation())
            .map { NetUserMapper.mapTo(it) }
            .doOnNext {
                // cache users to db
                database.userDao().insertUsers(DbUserMapper.mapFrom(it))
            }
    return Flowable.mergeDelayError(localData, remoteData)
}

или я могу просто подписаться на изменения базы данных. Результаты из сети будут храниться в базе данных, что приведет к обновлению.

Я боролся за реализацию этой задачи с использованием Jetpage Paging Library.

Как указано в документации по подкачке , это один из возможных сценариев.
Однако в упомянутом примере понятно, как загрузить данные только после того, как мы достигли конца таблицы базы данных. Это можно сделать с помощью PagedList.BoundaryCallback, который

Сигналы, когда PagedList достиг конца доступных данных.

Но я понятия не имею, как извлечь каждую страницу из сети, поскольку изначально загруженные данные могли измениться.

Одной из идей является вызов упомянутого getUsersPage() из источника данных (скажем, PageKeyedDataSource), точно в loadInitial() и loadAfter() методах. Но я не уверен, что он обновит данные, как только getUsersPage() испустит следующие данные, потому что javadoc говорит:

Обратный вызов может быть вызван только один раз, и будет вызван при повторном вызове.

Кроме того, есть много примеров использования библиотеки подкачки, но все, что я нашел, используют либо только данные из сети, либо только из базы данных.

Любой совет приветствуется

...