【发布时间】:2018-10-31 14:04:55
【问题描述】:
小问题:
使用使用页面 + 大小加载新页面的 API 和 BoundaryCallback 类从架构组件处理分页库上的数据库 + 网络的正确方法是什么?
研究与解释
目前,用于架构组件的分页库中的类BoundaryCallback 接收列表中元素的实例作为参数,而没有该元素所在位置的实际上下文。它发生在onItemAtFrontLoaded 和onItemAtEndLoaded。
我的 Api 应该接收页面和页面大小以加载下一个数据块。作为分页列表构建器的一部分添加的边界回调应该告诉您何时根据预取距离和页面大小加载下一页数据。
由于 Api 需要提供页码和页面大小,我看不到仅通过接收onItemAtFrontLoaded 和 @ 中提供的列表中的一个元素来将其发送到 Api 的方法987654330@。检查this link 中的谷歌示例,他们使用最后一个元素的名称来获取下一个元素,但这不适合页面+大小的 Api。
他们还有另一个示例,仅使用 PagedKeyedDatasource 的网络,但没有示例或线索说明如何将其与数据库和 BoundaryCallback 混合。
编辑: 到目前为止,我发现的唯一解决方案是将最后加载的页面存储在共享首选项中,但这听起来像是一个肮脏的把戏。
参考 https://github.com/googlesamples/android-architecture-components/issues/252#issuecomment-392119468 获取官方意见。
【问题讨论】:
-
真正的 问题是,如果您在服务器端有新元素,则每个项目所在的页面都会发生变化。您能否将基于
pageIndex的 API 长期可靠地缓存到 DB 中? -
如果元素按时间排序(最近的最后一页),或者像我的情况一样,生成的提要每天保持一次不变,则可能。有多个应用程序基于大小 + 页码的页面索引是有意义的,我已经看到许多 API 实现了这种模式
-
没有,只有官方支持评论里的那个
-
这取决于 API 响应是否提供元数据,例如
page和pages。当它使用键来获取下一页时,这似乎针对 noSQL 进行了优化 - 而对于 SQL,这不一定有意义......并且当遵循来自 GitHub cmets 的逻辑时;如果密钥同时被删除怎么办? -
从现在开始你找到解决办法了吗?
标签: android android-room android-architecture-components android-livedata android-paging