List 分页加载数据控制机制

分页加载是一种应用很广泛的数据展示控制机制,相信绝大多数开发者对于这一套机制都非常熟悉。这篇文章的主要目的结合实际的使用场景,对以往在开发中遇到一些概念进行梳理,归纳的同时加深理解,也希望能帮助更多刚刚接触到开发的同学。

本篇文章不聊怎么具体实现分页加载,因为现在太多成熟的方案,直接借助第三方的开源库可以减少很多细节的考虑,重复的造轮子是没有意义的。我们只需要从基本概念上切入,考虑实际场景的需求,针对一些主要问题进行分化,思考基本的解决方案是如何构建的即可,下面我们来一同进行思考。

适合分页加载的场景

要实现分页加载这套机制,在不同终端上的实现可以说是:基本原理相同,只是展示时处理起来有所差异而已。

在前端网页界面中,通常都是点击跳转后到下一页查看内容,一般都是直接提供了可点击的页码进行跳转,属于基本的分页式。而在移动设备 App 上,交互上主要靠手势的滑动控制,所以基本都是上滑时分页加载更多内容,可以说属于段页式。

对于移动终端上采用了列表形式( ListView 等等)展示内容时,在数据量较大的情况下,分页加载具有下面几个特点:

  • 减少初始加载的耗时(网络加载、数据解析、数据填充等)
  • 减小缓存数据时的内存消耗
  • 提升数据的实时性(一次请求缓存的数据,可能会存在实效性问题)
  • 降低单次网络请求失败的概率(弱网环境下,数据量越大越容易失败)
  • 减少一些不必要流量消耗(用户通常不会一次浏览特别多的数据)
  • 可以提升用户在交互上的体验(上滑加载更多)

在实际场景,如果需要对上述情况需求的,可以考虑一下进行分页加载。下面以在 Android 端实现 List 分页加载为例来梳理一些概念

分页加载的数据请求行为

这里需要先明确两个概念:界面上每页实际展示的数量控制请求时每页加载的数量。一般来说考虑到多设备适配,请求时每页加载的数量要大于每页实际展示的数量。

通常对于分页加载的数据请求行为主要有下面三个:

  • 初始化加载数据(首次启动界面时加载数据)
  • 下拉刷新数据 (刷新当前页面的数据)
  • 上拉加载更多 (加载下一页数据)

初始化的时候数据作为在创建界面时展示的内容,所以需要在保证在基础数据完备的情况下,考虑如何更快完成 loading 过程。这里有一个理念就是先保证可用性再考虑锦上添花的事情

通常对于实时性要求不高的应用,可以考虑读取预先缓存的历史数据作为初始化时的填充内容,界面加载完成后再主动请求进行刷新操作去更新界面内容。

在这种情况下,为了能够快速的滑动浏览内容,同时为了避免反复的网络请求,简单的实现可以设置一个 DataSet 作为网络数据请求成功后的内存缓存仓库,当然如果对应用有更高要求的,可以再考虑做数据持久化。这样就可以引出下面两种方案来设计。

方案一:缓存容器控制

原则就是:每次都是先读取当前已经缓存在容器中的数据,而从网络获取的数据是为了更新容器的数据,在更新到显示界面。

该方案基于前面提到的使用一个 DataSet 作为数据请求成功后的内存缓存仓库,在此基础上,界面获取的数据可以从这个 DataSet 中读取,只需要一次请求缓存较多的数据,不需要每次从网络读取数据。

只有当数据需要刷新或者 DataSet 数据展示量到达一个设定的阀值时,才开始从网络请求获取数据对 DataSet 容器进行更新,而关于数据排重可以根据每条 item 的唯一 ID 完成。

类似图片缓存控制一样,所以考虑做三级缓存也是可以的。

方案二:实时分页加载

这个方案的原则是:每次请求按需加载,加载更多时进行实时数据获取。

实际处理起来还是会有一些问题,比如刷新时如何控制新增数据的填充,加载更多时如何控制数据变化导致的数据重复添加。为解决这些问题需要考虑下面几个因素:

  • 每次请求的数据量(每页的数据量);
  • 当前数据展示总量(list 中已经加载的量);
  • 服务端数据总量;
  • 服务端总页数(按照当前每次请求数计算);

初始化加载数据时 初始化时,每次像服务器请求最新的第一页数据展示到 list,请求失败展示 No Content 页面(可手动刷新),并记录上面描述的几个数值。

下拉刷新数据 对比当前请求回来获取到的服务端数据总量和上次请求成功时保存服务端数据总量,两者的差值是否大于当前请求一页的数据量,如果是则直接替换原来的所有数据,不是的话只要把新增的数据 add 到 list 的 header 即可,注意数据排重。

上拉加载更多

获取上次请求时保存的页码数的下一页的数据添加到 list 的 footer 即可。

解决下拉加载更多时,服务端数据变化导致数据重复的解决方法有三种:

1、使用缓存:

可以定时的把n页缓存到数据库中,这样获取前面n页的时候就不会有重复的问题了,但是后面的分页内容还是无法保证不重复。

2、使用id作为限定进行分页:

客户端记录当前分页的最后一条记录的id,然后在请求下一页的时候,从这个id开始算起进行获取一页大小的内容,比如分页大小为20,按照id倒序获取列表内容:   select * from tablename where id   优点:这种方式可以确保不会获取到重复的数据;   缺点:需要调整服务器端和客户端的分页方法,通过当前记录id和pageSize去请求服务器端。并且如果按照其他字段而不是id进行的话要确保该字段不会被修改,并且不会有重复,考虑到性能,最好加上索引,推荐使用整型字段:   select * from tablename where 排序字段<:排序字段当前记录值 order="" by="" desc="" limit="" 0="" 20="" span="">   另外,如果需要加列表缓存,只能按照当前页的最后一条记录的ID作为key的标示,这样缓存需要的存储空间需要很多,如果列表添加数据很快,用户访问第一页的时候,总是会获取到新的数据,这样会不断的读数据库,然后写缓存,缓存利用率不高。(而类似于Hibernate的列表缓存,都是在数据表有增删改操作的时候,让列表缓存失效的,我猜也是出于数据库数据有改动的情况下缓存命中率不高,所以让列表缓存失效的,以便节省内存空间。)

3、客户端排除:

通过在客户端中保存已加载记录的id,进行数据去重,如果被去重的数据比较多,则可以考虑在请求下一页的数据。   优点:客户端记录已经加载的数据,再次加载的时候过滤掉已有的数据。这种方法能确保不会出现重复的数据,并且不改动服务器端的原有逻辑;   缺点:当列表数据增加很快的情况下,比如日志记录表,获取下一页的数据会有很多的重复记录,不适合这种情况,适用于列表数据添加不是很频繁的情况。   即使是用到了缓存,当缓存时间比较长,或者新增数据比较快时,在缓存失效以后,重新获取分页数据的时候也会有大量的重复内容。

转载于:https://juejin.im/post/5a3522e551882506cf0ef354

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284808.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【QGIS入门实战精品教程】3.3:QGIS如何打开ArcGIS创建的文件数据库(GDB)?

在行业应用中,GIS地理空间数据往往存储在ESRI ArcGIS的文件地理数据库(File GeodataBase),因此,ArcGIS与QGIS的数据交互、共享就显得非常重要。QGIS3可以直接打开File GDB数据,并对数据进行显示、查看、处理等操作。具体的步骤如下: 相关阅读:【QGIS入门实战精品教程】3…

.NET 6 Linux 系统服务 Systemd (案例版)

.Net Core Windows 系统服务&#xff0c;之前已经写过了&#xff0c;但是&#xff0c;对于Linux的系统服务&#xff0c;却没有写过&#xff0c;主要是因为&#xff0c;大部分Linux的.Net服务都直接Docker了&#xff0c;当然&#xff0c;不排除有这种使用的&#xff0c;可能搞成…

封装一个Array 数据 绑定 html select 方法

/** * * param {} select select控件 * param {} nodes Array数据 * param {} value value绑定项 * param {} text text绑定项 * param {} prompt 选择提示信息 * returns {} */ function bindSelect(select, nodes, value, text, prompt) {select.empty();if (prom…

XmlParser和HtmlParser

经常要用的Xml和Html解决&#xff0c;实际上这个领域也有非常好的解决方案。 相对来说现在各种开源的Xml解析功能比较丰富&#xff0c;机制也比较灵活&#xff0c;但是由于他功能比较完善&#xff0c;干的事情比较多&#xff0c;所以性能方面也慢一点&#xff1b;另外&#xff…

【QGIS入门实战精品教程】3.2:QGIS如何打开ArcGIS创建的个人数据库(MDB)?

文章目录 1. 下载并安装Microsoft Access 2010数据库引擎2. 配置系统环境变量3. 打开mdb数据库【相关阅读】 【QGIS入门实战精品教程】005:QGIS如何打开ArcGIS创建的文件数据库(GDB)? 1. 下载并安装Microsoft Access 2010数据库引擎 https://www.microsoft.com/zh-cn/down…

SharedPreferences操作数据

SharedPreferences是一个简单轻量的android存储数据类。适合保存配置信息等。是以XML方式存储的。 存储数据 SharedPreferences sharedPreferencesgetSharedPreferences("test", Context.MODE_PRIVATE);sharedPreferences.edit().putString("userName",&qu…

[转]IaaS、PaaS、SaaS、CaaS、MaaS五者的区别

云计算构架图 很明显&#xff0c;这五者之间主要的区别在于第一个单词&#xff0c;而aaS都是as-a-service&#xff08;即服务&#xff09;的意思&#xff0c;这五个模式都是近年来兴起的&#xff0c;且这五者都是云计算的落地产品&#xff0c;所以我们先来了解一下云…

使用java开发简单的mis系统所需的技术

开发mis系统用到的技术 1. b/s架构&#xff1a;就broser/server&#xff0c;浏览器/服务器的说法。服务器端要运行tomcat&#xff0c;提供链接数据库服务供java代码读写数据&#xff0c;这个可以在eclipse中配置运行。浏览器则解释jsp或html格式中的标记元素&#xff0c;用于显…

聊聊 C++ 中的四种类型转换符

一&#xff1a;背景 在玩 C 的时候&#xff0c;经常会用 void* 来指向一段内存地址开端&#xff0c;然后再将其强转成尺度更小的 char* 或 int* 来丈量一段内存&#xff0c;参考如下代码&#xff1a;int main() {void* ptr malloc(sizeof(int) * 10);int* int_ptr (int*)ptr;…

【QGIS入门实战精品教程】3.1:QGIS如何连接SQL Server数据库?

文章目录 软件必备测试SQL Server服务是否启动QGIS与SQL Server建立连接软件必备 SQL Server 2008 R2QGIS 3.22.3测试SQL Server服务是否启动 打开SQL Server配置管理器,查看MSSQLSERVER服务的启动情况。

开源重量级的流程引擎或UI引擎

关注这两个方面的同学个踊跃加粉了~~同时在下面回复期望开源哪一个&#xff0c;将先开源呼声高的一个。 好吧&#xff0c;先小秀一下UI&#xff1a; 增加下面的pom依赖&#xff0c;表示此工程需要org.tinygroup.aerowindow ?12345<dependency> <groupId>org.tinyg…

阿里云网盘内测开启 填写申请表获取邀请码 附最新申请地址

日前有相关报道显示&#xff0c;阿里方面推出了一款名为“阿里云网盘”的独立App&#xff0c;并且其是由阿里云团队开发&#xff0c;定位则是为C端用户提供可靠安全的存储备份及智能相册等功能。据了解&#xff0c;目前这款APP尚未正式上线&#xff0c;暂时还在邀请制测试阶段。…

02 JRE与JDK

JRE (Java Runtime Environment) JAVA 运行环境 包括JAVA虚拟机和JAVA程序所需要的核心类库&#xff0c;如查想要运行一个开发好的JAVA程序&#xff0c;计算机只需要安装JRE即可 JDK&#xff08;JAVA Development Kit &#xff09;JAVA开发工具包 JDK是提供给JAVA开发人员使用…

第 133 章 FAQ

133.1. Haproxy 与 Nginx Haproxy 与 Nginx 都能实现负载均衡&#xff0c;那么 Haproxy 与 Nginx proxy 有什么差异&#xff0c;我们怎样选择两种方案。 如果是用于 HTTP 负载均衡我建议使用 Nginx&#xff0c;它可以SSL证书挂载&#xff0c;缓存定制&#xff0c;实现各种复杂的…

跟我做⼀个⾼德地图的 iOS / Android MAUI控件(Android 原⽣库绑定)

我们已经介绍了如何通过 .NET 绑定 iOS 原⽣库 &#xff0c;本篇开始介绍⼀下如何通过 .NET 绑定 Android 原⽣库。Android的库Android 的库以 .jar 做打包&#xff0c; 通过⼯具你可以将多个 .jar 完成绑定&#xff0c;然后通过 C# 调⽤原⽣的 Java 库。对⽐起 iOS &#xff0…

【QGIS入门实战精品教程】4.6:QGIS实现栅格(影像、DEM)的拼接与掩膜提取

参考阅读:ArcGIS实验教程——实验十一:影像拼接与提取 加载实验数据 本实验所采用的栅格数据为两个dem数据和一个矢量范围数据,加载如下图所示: 栅格数据信息如下: 栅格拼接 点击下拉菜单【栅格】→【杂项】→【合并(merge)】,如下所示:

ReSharper 2020.2 补丁

ReSharper 是一个JetBrains公司出品的著名的代码生成工具。其能帮助Microsoft Visual Studio成为一个更佳的IDE&#xff0c;它包括一系列丰富的能大大增加C#和Visual Basic .net开发者生产力的特征。使用ReSharper&#xff0c;你可以进行深度代码分析&#xff0c;智能代码协助…

【转】【公司调查】车来了APP

http://blog.sina.com.cn/s/blog_83b10acc0102vk7k.html【APP简介】"车来了"是武汉元光科技有限公司开发的一款查询公交车实时位置的手机软件。不仅能提供公交车的到站距离、预计到站时间&#xff0c;还能显示整条线路的实时通行状况&#xff0c;让人们不再盲目等待&…

零中频接收机主要问题

直流偏差和本振泄漏问题基本不会影响超外差式接收机的性能&#xff0c;问题主要是镜频抑制。需要高Q值的带通滤波器。 零中频不存在镜频干扰&#xff0c;可以省掉镜像抑制滤波器和中频滤波器。零中频的主要问题是&#xff1a;1直流偏差 2本振泄漏 3 闪烁噪声。 1 本振泄漏 本振…

军哥华为HCNP(科目H12-221)真题解析课程:1-30题

华为HCNP&#xff08;科目H12-221&#xff09;真题解析HCNP-R&S-IERS&#xff1a;(Huawei Certified Network Professional-Implementing Enterprise Routing and Switching Network)第1部分 如何参加HCNP考试1.1很简单&#xff0c;华为HCNP即使没有HCNA证书也可以考取&…