- 这两天在做网络请求的缓存,我用的是retrofit2.1.0
- retrofit 实现缓存,其实质是okhttp实现网络缓存。
- 但是在这个工程中,遇到了一个问题 返回错误码 504,缓存数据没有读出来。
先说重点:
原因其实原因很简单:我的url中有个公共参数,
我的url是这样的
https://tc****.h****.cn/get_carousel_list?versionName=1.6.3&clientType=Nexus6_android_& net=wifi&user_id=8d16a137d5cc, tag=null
发现了吗?我的公共参数中有
net
这个值,
当我联网缓存的时候是net
的值是wifi
,3G
,LTE
,
当我断网的时候net
的值是disconnection
这就是我缓存失败的原因。
因为我们所有的数据是对url
进行了MD5
后,作为文件名,
包数据写对应的文件中。当我们网络状态改变的时候,
我们得到的MD5
的值更本不是同一个,
所以,我们更本无法拿到我们正确的缓存文件。
结论:
504
错误归根究竟是缓存没有找到。没找到的原因是缓存对应的url
改变了,错使MD5
后文件名改变,因此没有找到url
对应的缓存。
解决办法:
方法1、和服务端协商,将url
中的公共参数,例如net
的状态放在header
中。
方法2、去掉net这个参数,是url保持固定,不要变动。
方法3、还没想的,只要能让人你的url保持不变的方法都可行。
一点总结:
其实缓存的实现方法,网上有无数的博客都做了详细的说明。这里不做阐述。
出了问题,我为解决这个问题,翻遍了网上的所有博客,以为是缓存使用的不对,还怀疑是自己的拦截器不对,怀疑的问题很对。可是似乎就我这里有问题,博客上没有任何阐述相关问题。大家视乎用的都很顺利。
其实这个问题也不难想到,只是自己当时面对整个未知的框架,未知的缓存,最重要的是觉得未知的太多。所以没有深入的去思考这个问题。
其实我们遇到问题时候,应该静心去思考问题。分析问题,这样我们才能成长,才能进步。我这次就花费了不少时间,问题在于我没有好好静心分析这些问题。希望大家也引以为戒。
最后:有需要Shadowsock翻墙账号可以私聊。