Skip to content
panwj edited this page Jun 17, 2019 · 4 revisions

概览

    Paging配合RecyclerView更容易从数据源中高效优雅的加载所需数据,不会因为数据库数据量大而造成查询时间过长。
Paging库的优点:
1. 数据请求占用比较少的网络带宽和系统资源;
2. 在数据更新和刷新期间,app也能快速响应用户输入

库架构

库架构:分页库关键组件是PagedList类,该类异步加载app所需要的数据以及分页数据。这个类为app的其他架构组件提供了联系。分页库实现了观察者模式.

Data: 每个PagingList实例从DataSource为你的App提供最新的数据。数据流从你的app后台或者数据库流向PagingList对象。DataSource提供一个单一的元数据,Factory加载内容。 分页库支持支持很多app架构,包括独立数据库或者服务器网络数据。

UI: PagingList类和PagingListAdapter配合使用,加载items数据到RecyclerView中。这些类一起使用来获取和显示已经加载的数据,预加载以及观察数据变化并自动更新。

数据架构

支持的数据架构:仅从网络获取、仅从本地数据库获取、从网络和数据库同时获取

  1. 网络获取或本地数据库:都是异步实现数据加载 数据库获取时,观察数据库,数据库内容发生改变数据库就会pull一个新的PagedList。 RecyclerView加载本地数据,可以使用Room库。通过这种方式,当向数据库中添加、修改、删除数据,这些变化都会被观察到,从而触发UI自动刷新。 网络获取时,下拉刷新网络加载(后端不发送更新)时会pull一个新的PagedList并使旧的无效。从后台服务器获取,使用同步的Retrofit API加载网络数据到你的DataSource对象中。

  2. 网络和数据库同时获取 数据库是网络缓存的数据,ui从数据库加载数据,数据库没有在从网络获取,又在回调中请求网络,将获取到的数据插入数据库,ui订阅了数据库的更新,因此,新的数据会流向正在观察的ui,实现刷新。

    注意:分页库的DataSource对象不提供任何错误处理,因为不同app处理和展示错误的方式不同。如果一个错误发生,将错误传递给callback中,尝试后续重新请求

对比

当前实现分页加载的方法有两种,使用CursorAdapter;使用AsyncListUtil 1. CursorAdapter 可以是ListView很容易的加载数据,但是他是运行在UI线程的,而且Cursor也会在页面上出现无效的现象。

  1. AsyncListUtil允许RecycleView基于position进行分页加载,但是不允许非position进行分页加载,在数据集中强制使用null作为修饰符。 Paging解决了这些问题。此库简化了请求数据的过程。

Clone this wiki locally