Android(安卓)Jetpack - paging(分页库)
在我们实际的开发环境中可能设计到这样的一个场景,就是用RecyclerView来加载网络或者数据库中的信息展示给用户,如果数据只有少量还好,一旦涉及到成千上万条数据的时候,如果一次将所有数据都加载出的话,我们的UI就会响应的非常缓慢。或者利用缓冲池来异步加载,但是也许用户也就查看前面的一部分,造成就资源的浪费与软件的压力。当然也可以自己写一些逻辑触发到指定的条件才进行下一次请求(类似于分页,我之间就是这样做的)。直到去年发现先了Android Jetpack 中的 paging 库,用起来是真的香。
在使用 paging 库之前我们需要添加依赖:
dependencies { def paging_version = "2.1.1" implementation "androidx.paging:paging-runtime:$paging_version" testImplementation "androidx.paging:paging-common:$paging_version" implementation "androidx.paging:paging-rxjava2:$paging_version"}
假如说现在我们在做一个社区人员统计软件,需要向社区中的每个人展示其他人的基本信息。我们先定义一个关于人员基本信息的类。
public class PersonInfo{ String name; int age;}
假如我们的需求是第一次查看人员列表的时候需要要展示40条数据,当用户向下浏览当剩余5条的时候我们再加载20条数据。我们可以根据规则创建一个PagedList.Config实例
private PagedList.Config config = new PagedList.Config.Builder() // false以使用此Config禁用PagedLists中的空占位符。 .setEnablePlaceholders(false) // 定义首次加载时要加载的项目数。 .setInitialLoadSizeHint(40) // 定义访问必须离开已加载内容的边缘多远才能触发进一步的加载。 .setPrefetchDistance(5) // 定义从DataSource一次加载的项目数。 .setPrefetchDistance(20) .build();
然后创建一个 PositionalDataSource 类的对象。PositionalDataSource类是数据加载器,在数据加载器中来定义我们数据的来源。实际生产环境我们的数据可能来自于数据库,也可能来自与网络,关于具体的数据生成需要自己实现。
private PositionalDataSource positionalDataSource= new PositionalDataSource() { @Override public void loadInitial(LoadInitialParams params, LoadInitialCallback callback) { // 首次加载数据 // params中包含我们定义的数据加载规则 List personInfoList = //数据生成; // 回调返回数据 callback.onResult(personInfoList , params.requestedStartPosition); } @Override public void loadRange(LoadRangeParams params, LoadRangeCallback callback) { // 当触发我们的加载条件的时候触发 // params中包含我们定义的数据加载规则 List personInfoList = // 数据生成; // 回调返回数据 callback.onResult(personInfoList); } };
到这里数据来源方面就定义完成,现实中还会有这样的情况,在我们浏览的过程中某些人是数据被删除掉了。如果用户刚好点击了这条被删除的数据就不太友好了。我们可以利用LiveData来处理这个问题,LiveData也是Jetpack 中的一个组件,可以观察数据的变化,这点和观察者有些类似,不过不需要我们来实现观察与被观察之间的推送逻辑。
我们需要生成一个DataSource.Factory的实例,因为PositionalDataSource并不能直接被LiveData所观察,DataSource.Factory是数据源工厂,可以被LiveData观察。在有数据改变时可以通知UI做出相应的动作。我们只需要创建与LiveData所关联的UI无需再做其他处理。
private DataSource.Factory factory = new DataSource.Factory() { @Override public DataSource create() { // 返回我们的数据源 return positionalDataSource; } };public LiveData> getPagedListLiveData() { // 利用LivePagedListBuilder观察数据工厂中的数据 if (pagedListLiveData == null) { pagedListLiveData = new LivePagedListBuilder<>(factory, config).build(); } return pagedListLiveData; }
最后我们将LiveData与RecyclerView关联。这里RecyclerVIew的adapter需要用paging中的PagedListAdapter。
getPagedListLiveData().observe(this, Observer(adapter::submitList))
分页库就介绍到这里。我感觉Android jetpack极大的方便某些方面的开发。在上述应用中有什么问题欢迎您指导!
更多相关文章
- SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
- 一句话锁定MySQL数据占用元凶
- Android中直播视频技术探究之---桌面屏幕视频数据源采集功能分析
- 自定义Android电子时钟控件
- Android自定义控件系列案例【四】
- android中不同app间数据交互(1、简单一次性数据交互)
- Android利用jsoup爬虫爬网页数据(二)
- Android中直播视频技术探究之---采集摄像头Camera视频源数据进行
- android adb 流程原理代码分析(一)