现有学生实体类 Student
public class Student {
private int no;
private String name;
private int score;
}
需要为移动端提供数据查看学生成绩,数据源未使用数据库仅使用Java集合,若Server的数据源为List<Student>,内容如下:
0 张三 58
1 李四 42
2 王五 23
假设移动端每次请求只显示两条数据,则首次显示
0 张三 58
1 李四 42
移动端下拉页面,请求下一页数据,并将no=1发回给Server,此时移动端就多了一条数据,变为:
0 张三 58
1 李四 42
2 王五 23 --下拉后得到的新数据
若数据源固定不变这样是没有问题的,但实际情况是学生的信息会随时变化,即可能在移动端下拉请求下一页之前"1 李四 42"这条数据就没有了,此时再将no=1发回给Server会产生各种各样的问题,例如:同一条数据显示两次、有的未被显示等问题,有什么方法在不使用数据库的情况下按这种方式为移动端提供列表数据呢?想不通哇=。=
樓上的難道沒做過行動端分頁嘛? ?行動端分頁涉及到有變化的資料肯定不是按page=1這種方式來的,不然要重複或漏掉,(漏掉還好,重複客戶端一下就發現了)
通用解決方案是這樣的:
首先你一定有個排序唄,比如說按時間,按分數等,客戶端要下一頁只需要傳它當前頁的最後一條記錄的標識符就ok了,服務器拿到這個標識符再找後面的數據給它。
例子:
假設server端資料是1,2,3,4,5,6,7,8 回給client資料是1,2,3,這時需要3後面的數據,就把3傳回server, server拿到3再按照約定邏輯找到比3大的是4,5,6給client,這樣即使新增或刪除都不會有重複問題
以前我們做瀑布流圖片展示就是這樣的,另外FB,instagram的api很多都是這樣設計的
no=1麼有就找no=2
你都不用資料庫,那資料怎麼還會消失呢? list1 = list.subList(0,3); list2 = list.subList(3,6); list3 = list.subList(6,9);
分頁可以嗎?按照你存的list.類似如下偽代碼:
`
List
List
List
`
分頁清單中的資料被刪除的情況確實很麻煩...
可以考慮3種解決方法:
資料量小的話不要進行分頁了,直接一次性把清單中的資料全給客戶端
資料量大非要分頁的話,可以考慮每次不光傳遞要獲取的那一頁的數據,順便把前面已經獲取過了的頁面的數據的diff(變化情況)傳給客戶端
如果資料變化,傳給客戶端一個資料有變化了的標誌,讓客戶端刷新整個清單或提示使用者應該要刷新整個清單。
先將students的集合依照id排序,然後把上次請求最後一條資料的id和size做為請求的入參進行分頁,這裡的id也就是Student.no。