目录
Paging 组件的意思
Paging 支持的架构类型
Paging 的工作原理
PositionalDataSource
PagekeyedDataSource
ItemKeyedDataSource
BoundaryCallback
Paging 组件的意思
分页加载是在应用程序开发过程中十分常见的需求,Paging 就是 Google 为了方便 Android 开发者完成分页加载而设计的一个组件,它为几种常见的分页机制提供了统一的解决方案,让我们可以把更多的精力专注在业务代码上。
Paging 支持的架构类型
网络
对网络数据进行分页加载,是最常见的一种分页需求,也是我们学习的重点。不同的公司针对分页机制所设计的 API 接口通常也不太一样,但总体而言可以归纳为3种。Paging 组件提供了3种不同的方案,以应对不同的分页机制。分别是 PositionDataSource、PageKeyedDataSource、ItemKeyedDataSource。
数据库
掌握了网络数据分页之后,数据库数据分页将会容易很多,无非就是数据源的替换。
网络+数据库
出于用户体验的考虑,我们通常会对网络数据进行缓存,以便用户在下次打开应用程序时,应用程序可以先展示缓存数据。我们通常会利用数据库对网络数据进行缓存,这意味着我们需要同时处理好网络和数据库这两个数据源。多数据源会让业务逻辑变得更为复杂,所以,我们通常采用单一数据源作为解决方案。即从网络获取的数据,直接缓存进数据库,列表只从数据库这个唯一的数据源获取数据,这里我们会学习 BoundaryCallback。
Paging 的工作原理
Paging 的3个核心类
PagedListAdapter
RecyclerView 需要搭配适配器使用,如果希望使用 Paging 组件,适配器需要继承自
PagingListAdapter。
PagedList
PagedList 负责通知 DataSource 何时获取数据,以及如何获取数据。例如,何时加载第一页/下一页,第一页加载的数量、提前多少条数据开始执行预加载等,从 DataSource 获取的数据将存储在 PagedList 中。
DataSource
在 DataSource 中执行具体数据载入工作,数据可以来自网络,也可以来自本地数据库。根据分页机制的不同,Paging 为我们提供了3种 DataSource。数据的载入需要在工作线程中进行。
PositionalDataSource
适用于可通过任意位置加载数据,且目标数据源数量固定的情况。例如,请求时携带的参数为 start = 2&count = 5,则表示向服务端请求从第2条数据开始往后的5条数据。
DiffUtil
DiffUtil 用于计算两个数据列表之间的差异,它只会更新需要更新的数据,而不需要刷新整个数据源。
areItemsTheSame:检测两个对象是否代表同一个 item
areContentsTheSame:检测两个 Item 是否存在不一样的数据
PagekeyedDataSource
适用于数据源以页的方式进行请求的情况, 例如,若请求时携带的参数为 page=2&pageSize=5,则表示数据源以5条数据为一页,当前返回第二页的5条数据。
ItemKeyedDataSource
适用于当目标数据的下一页需要依赖上一页数据中最后一个对象中的某个字段作为 key 的情况,此类分页形式常见于评论功能的实现。例如,若上一页数据中最后一个对象的 key 为 9001,那么在请求下一页时,需要携带参数 since=9001&pageSize=5,则服务器会返回 key=9001 之后的5条数据。