Android Jetpack分页-从网络和数据库加载数据

时间:2019-05-20 15:18:41

标签: android pagination android-jetpack android-paging

我的目标是实现分页,其中首先从数据库显示每个页面,同时从网络请求同一页面。
我想使用分页库来解决它。

目前,我看到的情况如下:

  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)
}

或者我可能只是订阅数据库更改。来自网络的结果将存储在数据库中,这将触发更新。

我在使用Jetpack Paging Library来执行此任务时遇到了困难。

paging documentation中所述, 这是可能的情况之一。
但是,在上述示例中,仅当我们到达数据库表的末尾时,才清楚如何加载数据。可以使用PagedList.BoundaryCallback来完成,

  

当PagedList到达可用数据末尾时发出信号。

但是我不知道如何从网络获取每个页面,因为最初加载的数据可能已更改。

一个想法是从数据源(如getUsersPage())中准确地以PageKeyedDataSourceloadInitial()方法调用提到的loadAfter()。 但是我不确定getUsersPage()发出下一个数据后是否会更新数据,因为javadoc说:

  

回调只能被调用一次,如果再次被调用则将抛出。

此外,还有许多使用分页库的示例, 但是我发现的所有数据要么仅使用来自网络的数据,要么仅使用来自数据库的数据。

任何建议都值得赞赏

0 个答案:

没有答案