您的位置:首页 > 其它

Retrofit 源码解读之离线缓存策略的实现

2016-03-29 09:03 330 查看
Retrofit 是square公司开发的一款网络框架,也是至今Android网络请求中最火的一个,配合OkHttp+RxJava+Retrofit三剑客更是如鱼得水,公司项目重构时,我也在第一时间使用了ReJava+Retrofit,使用过程中遇到的一些问题,也会在后续的博客中,一点点分享出来,供大家参考!

在项目的过程中,项目需求需要在离线的情况下能够继续浏览app内容,第一时间想到缓存,于是经过各种google搜索,得出以下结论(使用Retrofit 2.0)

-参考stackoverflow地址 ,Retrofit 2.0开始,底层的网络连接全都依赖于OkHttp,故要设置缓存,必须从OkHttp下手

-具体的使用过程为:1.先开启OkHttp缓存

我们可以看到 先获取系统外部存储的缓存路径,命名为response,此文件夹可以在android/data/<包名>/cache/resposes看到里面的内容,具体OkHttp是如何做到离线缓存的呢?

我们进入Cache类,有重大发现,首先是它的注释,极其详细

文档详细说明了此类的作用,支持Http缓存使用,然后具体的用法,可惜的是我们这里使用的是Retrofit,无法直接用OkHttp,如果直接用OkHttp的童鞋们,可以根据上面的提示,完成具体的缓存操作。

通过阅读文档,我们知道还有一个类,CacheControl类,只要负责缓存策略的管理,其中,支持一下策略

1. noCache 不使用缓存,全部走网络

2. noStore 不使用缓存,也不存储缓存

3. onlyIfCached 只使用缓存

4. maxAge 设置最大失效时间,失效则不使用 需要服务器配合

5. maxStale 设置最大失效时间,失效则不使用 需要服务器配合 感觉这两个类似 还没怎么弄清楚,清楚的同学欢迎留言

6. minFresh 设置有效时间,依旧如上

7. FORCE_NETWORK 只走网络

8. FORCE_CACHE 只走缓存

通过上面的CacheControl类,我们很快就能指定详细的策略

首先,判断网络,有网络,则从网络获取,并保存到缓存中,无网络,则从缓存中获取

所以,最终的代码如下

-首先,给OkHttp设置拦截器

-然后,在拦截器内做Request拦截操作

其中,AppUtil.isNetworkReachable(UIUtils.getContext())是判断网络是否连接的方法,具体逻辑如下

在每个请求发出前,判断一下网络状况,如果没问题继续访问,如果有问题,则设置从本地缓存中读取

-接下来是设置Response

先判断网络,网络好的时候,移除header后添加cache失效时间为1小时,网络未连接的情况下设置缓存时间为4周

-最后,拦截器全部代码

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: