概述
使用分页库的好处
分页库包含以下功能:
- 分页数据的内存中缓存。这可确保您的应用在处理页面数据时有效地使用系统资源。
- 内置请求重复数据删除功能,确保您的应用有效地使用网络带宽和系统资源。
- 可配置
RecyclerView
适配器,当用户滚动到已加载数据的末尾时会自动请求数据。 - 对Kotlin协程和Flow以及
LiveData
的支持 。 - 内置的错误处理支持,包括刷新和重试功能。
架构设计
分页库隶属于安卓推荐架构设计的一部分。该库的组件在应用程序的使用中,涉及到三层结构。
- The repository layer
- The
ViewModel
layer - The UI layer
上图描述了在每个层上运行的分页库组件,以及它们如何协同工作以加载和显示分页数据。
储存库层
存储库层中的主要分页库组件为 PagingSource
。每个 PagingSource
对象都定义一个数据源以及如何从该源中检索数据。PagingSource
对象可以从任何单个源,包括网络源和本地数据库加载数据。
您可能会使用的另一个分页库组件是 RemoteMediator
。 RemoteMediator
对象用以处理分层数据源,例如有本地数据库缓存的网络数据源。
ViewModel层
该Pager
组件提供了一个公共API,用于构造PagingData
对象(基于PagingSource
,在响应流中公开的实例)和 PagingConfig
配置对象。
将ViewModel
图层连接到UI的组件是 PagingData
。PagingData
目的是用于分页数据的快照的容器。它查询一个 PagingSource
对象并存储结果。
UI层
UI层中的主要分页库组件是 PagingDataAdapter
,RecyclerView
用于处理分页数据的 适配器。
或者,您可以使用随附的 AsyncPagingDataDiffer
组件来构建自己的自定义适配器
**注意:**如果您的应用程序使用Compose for UI,请使用
androidx.paging:paging-compose
工件将Paging与UI层集成。要了解更多信息,请参阅的API文档collectAsLazyPagingItems()
。
加载并显示网络数据源的分页数据流
定义数据源
第一步是定义一个 PagingSource
实现以识别数据源。该PagingSource
API类包括 load()
方法,它必须重写,以指示如何从相应的数据源中检索分页数据。
PagingSource
直接使用该类可将Kotlin协程用于异步加载。
Paging库还提供了支持其他异步框架的类:
- 要使用RxJava,请改为
RxPagingSource
。 - 要
ListenableFuture
在Guava中使用,改为ListenableFuturePagingSource
。
选择键和值类型
PagingSource<Key, Value>
有两个类型参数:Key
和Value
。键定义用于加载数据的标识符,值是数据本身的类型。
例如,如果您通过传递Int
页码给 Retrofit,从网络加载的User
对象的分页数据。
应该选择Int
作为Key
类型,User
作为Value
类型。
定义PagingSource
以下示例实现了一个 PagingSource
按页码加载分页数据。该Key
类型是Int
与Value
类型 User
。
class ExamplePagingSource(
val backend: ExampleBackendService,
val query: String
) : PagingSource<Int, User>() {
override suspend fun load(
params: LoadParams<Int>
): LoadResult<Int