我的目标是实现分页,其中首先从数据库显示每个页面,同时从网络请求同一页面。
我想使用分页库来解决它。
目前,我看到的情况如下:
@Query("SELECT * FROM user " +
"WHERE id > :lastUserId " +
"ORDER BY id ASC " +
"LIMIT :pageSize")
fun getUsersPage(lastUserId: Long, pageSize: Int) Flowable<List<DBUser>>
其中lastUserId用于确定页面开始。
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()
)中准确地以PageKeyedDataSource
和loadInitial()
方法调用提到的loadAfter()
。
但是我不确定getUsersPage()
发出下一个数据后是否会更新数据,因为javadoc说:
回调只能被调用一次,如果再次被调用则将抛出。
此外,还有许多使用分页库的示例, 但是我发现的所有数据要么仅使用来自网络的数据,要么仅使用来自数据库的数据。
任何建议都值得赞赏