在我们实际的开发环境中可能设计到这样的一个场景,就是用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极大的方便某些方面的开发。在上述应用中有什么问题欢迎您指导!

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 一句话锁定MySQL数据占用元凶
  3. Android中直播视频技术探究之---桌面屏幕视频数据源采集功能分析
  4. 自定义Android电子时钟控件
  5. Android自定义控件系列案例【四】
  6. android中不同app间数据交互(1、简单一次性数据交互)
  7. Android利用jsoup爬虫爬网页数据(二)
  8. Android中直播视频技术探究之---采集摄像头Camera视频源数据进行
  9. android adb 流程原理代码分析(一)

随机推荐

  1. android XMl 解析神奇xstream 五: 把复杂
  2. Android设置item的行间距,以及去掉分割线
  3. [原]如何在Android用FFmpeg+SDL2.0解码图
  4. Android监听手机软键盘的弹起和关闭
  5. 生成release版本的Android係統
  6. 十六周总结报告
  7. Android键盘系统
  8. Android(安卓)各种专业术语解释
  9. Android入门教程(三)之------导入现有And
  10. 【Android】AndroidStudio空指针解决之:li