@Tonlin 你好,想跟你请教个问题:
很感谢你贡献了一个很棒的APP源码,最新我在分析列表页面的上拉加载,下拉刷新,请求与缓存数据如何去平衡的问题。http://my.oschina.net/wzi90921/blog/335010。没人给我回复,只能自己动手查看你的处理逻辑,希望能从你的代码中学到更好的解决方法。
前提条件:可以正常访问网络!
下拉刷新,都会传递pageIndex=0,请求新的数据。
上拉加载,会先判断是否加载过,如果加载过,则读取缓存数据。
protected void requestData(boolean refresh) { String key = getCacheKey(); if (TDevice.hasInternet() && (!CacheManager.isReadDataCache(getActivity(), key) || refresh)) { sendRequestData(); } else { readCacheData(key); } }不知道,我对你的代码理解是否准确;如果理解有误,麻烦你更正。
基于上面的理解:
2种情况,可能会导致列表数据的不完整性。
假设条件:本地缓存了从0-10页的数据。
1.当下拉刷新时:新增的数据超过20条(假设新增了25条数据);那么第0页返回20条数据;当你往上滑动时,触发到了上拉刷新时,那么根据我上面的理解,会加载本地缓存数据(之前已经缓存了);而且新缓存的第一页数据会替换先前缓存的第一页数据,这样的话,列表的数据跟服务端的数据不同步了,缺少第21-25条,26-45条之间的数据。
2.当下拉刷新时:新增的数据少于20条(假设新增了15条数据);那么第0页返回20条数据;当你往上滑动时,触发到了上拉刷新时,那么根据我上面的理解,会加载本地缓存数据(之前已经缓存了)。因为新增15条数据,返回是20条数据,就有5条数据是之前的。但是新缓存第一页数据会替换先前缓存的第一页数据,这样的话,列表的数据跟服务端的数据不同步了,缺少第21-35条之间的数据。
第20条数据,接下来的 “Monkey HTTP Server ……” 在oschina却是
跟oschina 网站显示的数据不同步。
我的看法:
看了oschina的API,每次请求时值传递页码,用户下拉刷新,获取第1页;当用户上拉加载时,再次请求第2页,缓存下载的数据,只在无网络的情况下才会加载本地数据。这样可能消耗的流量会多些。
还有一个问题,为什么缓存的数据不用数据储存,而是用文件的方式呢?
oschina 的分页API设计有点问题,当用户下拉刷新加载最新的20条,上拉加载更多(传递页码请求服务端),当上一次获取最新的数据 到 触发上拉加载更多这段时间,如果有新增数据,那么服务端的分页也该改变了,新增25条(超过20条),那么加载到的数据,会是新增最后5条+原先第一页前15条。新增15条(少于20条),那么加载到的数据,是原来第一页第5-20条+原先第二页21-25条。
我最近在思考这个问题,http://my.oschina.net/wzi90921/blog/335010
如果你有什么更好的方法,请指点下!
再次感谢你贡献的代码
感谢你对哎嘛的支持,是会存在你所描述的这些问题,由于时间问题我直接使用了官方客户端的缓存策略。最近一段时间比较忙没有时间去更新哎嘛。等我下次更新我会认真参考你的建议,谢谢你的支持######
其实有些数据不需要时时的保持与服务器同步,可以设置一个缓存的有效时间
这个有效时间可以根据不同的数据来设定,比如资讯和帖子的缓存时间可以长很多,而动弹这些数据变动比较快的数据,就缓存时间短些,以尽可能地与服务器数据同步。
另外这个有效时间也可以根据网络环境来设定,wifi<移动网络;
官方老的方式确实不太好,只缓存了第一页的数据
######确实是有这问题######现在的版本已经解决这个问题了,更新一下代码吧!######本地旧数据的评论数如何服务器同步版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。