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.pswp.cn/news/284808.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284808.shtml
英文地址,請注明出處:http://en.pswp.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證書也可以考取&…