Jetpack-Paging3学习

130 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情

Paging3是什么

Paging 库可帮助您加载和显示来自本地存储或网络中更大的数据集中的数据页面。此方法可让您的应用更高效地利用网络带宽和系统资源。Paging 库的组件旨在契合推荐的 Android 应用架构,流畅集成其他 Jetpack 组件,并提供一流的 Kotlin 支持。

Paging3的优势

  • 内置对错误处理功能,重试、刷新等。

  • 对Kotlin协程和流Flow提供了一流的支持。

  • 对于结合RecyclerView使用时,自带自动请求下一页,也就是分页功能,可以说是丝滑。

  • 内置请求信息去重功能,避免流量浪费,资源利用率较高,同时支持内存缓存,处理分页时高效利用系统资源。

结构分成

一般主要层级会分为三层,请求层、ViewModel层、UI页面层

  • 请求层
    主要是对数据源的定义与处理PagingSource,划重点Google推荐的是单一可信数据源,即是官方的Demo,配合网络请求与本地数据库,即是从网络获取数据也并不是直接显示到UI页面上。而是更新了数据库后,数据库的变动驱动UI页面的展示。确保了数据来源单一。这么做有什么好处与不足,一步步探讨。RemoteMediator主要是用来处理数据的分页,同时数据可以来自于网络与本地,起到了整合的作用。

  • ViewModel层
    数据配置Pager配合PagingConfig对数据流PagingData进行配置,如请求的数据size大小,是否开启null占位符等。

  • UI层
    适配器的定义PagingDataAdapter,分页处理加载数据的核心类。跟普通的适配器区别不是很大,但是需要配合DiffUtil对数据进行去重判断。

image.png

数据的流向

多数据源变成单一数据源 image.png

Paging3几个重要的类

PagingSource

PagingSource的实例用于为PagingData的实例加载数据页面,每次刷新数据都会有一个单独PagingData与之对应,而配合的DiffUtil则可以处理重复内容的去重工作。Key在请求网络数据时可以表示对应的页码,请求的是数据库的数据时也可以表示为位置Position。Value则是对应DTO或者PO,当然通常的项目中对于上层UI所使用的数据一般并不会直接使用原始数据。首先服务端返回的数据并不是都能够被完全用于UI,为了简洁都会通过Mapper做一次映射,转化成合理的VO数据。也即是DTO/PO ----Mapper<>–>VO

RemoteMediator

协同网络数据与本地数据库Room,但是官方的推荐做法并不是直接使用网络数据作为数据源,是将网络数据缓存到本地数据库,由数据库担任唯一的数据源来驱动页面。实际开发过程中,数据是有实效性的,应该在合适的时机使本地数据失效而以服务端数据为主,并刷新到本地数据库。这就要定义初始化类型initialize:

  • LAUNCH_INITIAL_REFRESH:完全刷新本地数据,会阻塞包括PREPEND、APPEND,直到全量刷新成功以后返回新的数据
  • SKIP_INITIAL_REFRESH:加载本地数据,跳过远程刷新。
    对于RemoteMediator加载方法中Load里包含了一个参数LoadType,那么这个LoadType是什么呢?其实就是定义了刷新机制,集合RecyclerView的用户操作,不断上滑的过程中,Paging请求下一页的内容。或者切换了不同搜索条件那么自然是全量刷新,而查看已经加载过的数据,可以理解为从内存数据中加载某一段数据,也即是中间部分的数据。简单的里脊就是LoadType是用来监听UI操作的。
Pager

可以直接创建一个单纯的网络数据分页,同时也支持本地与网络共享的状态。唯一的区别就是需要提供数据库Room的查询方法,并且提供RemoteMediator实例。当然还包括一些配置条件PagingConfig,如网络加载数据一页的条目,是否开启null占位