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周
-最后,拦截器全部代码
在项目的过程中,项目需求需要在离线的情况下能够继续浏览app内容,第一时间想到缓存,于是经过各种google搜索,得出以下结论(使用Retrofit 2.0)
-参考stackoverflow地址 ,Retrofit 2.0开始,底层的网络连接全都依赖于OkHttp,故要设置缓存,必须从OkHttp下手
-具体的使用过程为:1.先开启OkHttp缓存
我们进入Cache类,有重大发现,首先是它的注释,极其详细
通过阅读文档,我们知道还有一个类,CacheControl类,只要负责缓存策略的管理,其中,支持一下策略
1. noCache 不使用缓存,全部走网络
2. noStore 不使用缓存,也不存储缓存
3. onlyIfCached 只使用缓存
4. maxAge 设置最大失效时间,失效则不使用 需要服务器配合
5. maxStale 设置最大失效时间,失效则不使用 需要服务器配合 感觉这两个类似 还没怎么弄清楚,清楚的同学欢迎留言
6. minFresh 设置有效时间,依旧如上
7. FORCE_NETWORK 只走网络
8. FORCE_CACHE 只走缓存
通过上面的CacheControl类,我们很快就能指定详细的策略
首先,判断网络,有网络,则从网络获取,并保存到缓存中,无网络,则从缓存中获取
所以,最终的代码如下
-首先,给OkHttp设置拦截器
-接下来是设置Response
-最后,拦截器全部代码
相关文章推荐
- MySQL数据库插入中文数据乱码问题
- 详解Android中的Menu菜单键
- checkio--
- Asp.Net Web API 2第四课——HttpClient消息处理器
- 教训---互联网创业必须避免的八大误区(读书笔记)
- android命令行创建项目及编译项目
- 高层论坛︱王家耀院士:“互联网+”时空大数据与智慧城市(1)
- How to Change Windows Password Policy?
- 关系数据库设计范式
- 剑指offer 8 跳台阶
- 如何处理服务器SSL收到了一个弱临时Diffie-Hellman 密钥?
- getActionBar()空指针异常
- Asp.Net Web API 2第三课——.NET客户端调用Web API
- 优秀的程序员不会觉得累成狗是一种荣耀
- 关于flash擦除引起的bug问题小结
- Asp.Net Web API 2第二课——CRUD操作
- php excel
- [leetcode] 69. Sqrt(x)
- 逆波兰表达式
- 换零钱