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<PersonInfo> positionalDataSource=
            new PositionalDataSource<PersonInfo>() {
                @Override
                public void loadInitial(LoadInitialParams params, LoadInitialCallback<PersonInfo> callback) {
                    
                    // 首次加载数据
                    // params中包含我们定义的数据加载规则
                    List<PersonInfo> personInfoList = //数据生成;

                    // 回调返回数据
                    callback.onResult(personInfoList , params.requestedStartPosition);
                }

                @Override
                public void loadRange(LoadRangeParams params, LoadRangeCallback<PersonInfo> callback) {
                    
                    // 当触发我们的加载条件的时候触发
                    // params中包含我们定义的数据加载规则
                    List<PersonInfo> personInfoList = // 数据生成;

                    // 回调返回数据
                    callback.onResult(personInfoList);
                }
            };

到这里数据来源方面就定义完成,现实中还会有这样的情况,在我们浏览的过程中某些人是数据被删除掉了。如果用户刚好点击了这条被删除的数据就不太友好了。我们可以利用LiveData来处理这个问题,LiveData也是Jetpack 中的一个组件,可以观察数据的变化,这点和观察者有些类似,不过不需要我们来实现观察与被观察之间的推送逻辑。

我们需要生成一个DataSource.Factory的实例,因为PositionalDataSource并不能直接被LiveData所观察,DataSource.Factory是数据源工厂,可以被LiveData观察。在有数据改变时可以通知UI做出相应的动作。我们只需要创建与LiveData所关联的UI无需再做其他处理。

private DataSource.Factory<Integer, PersonInfo> factory = new DataSource.Factory<Integer, PersonInfo>() {
        @Override
        public DataSource<Integer, PersonInfo> create() {
            // 返回我们的数据源
            return positionalDataSource;
        }
    };


public LiveData<PagedList<PersonInfo>> 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极大的方便某些方面的开发。在上述应用中有什么问题欢迎您指导!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值