OkHttp实现缓存
标题字越少,内容含金量越高。
需求描述
需求
在有网的情况下,正常进行网络请求,然后把响应缓存到本地;在无网的情况下,从本地拿到缓存,返回给调用方。
限制
不能改变服务器的API,服务器的API没有Cache-Control字段。
思路
利用OkHttp的拦截器实现。
OkHttp请求过程:OkHttp的缓存机制(CacheInterceptor)会自动判断我们提交的Request中的Cache-Control头:如果是only-if-cache(FORCE_CACHE),则只能从缓存中获取,不能进行网络请求,如果获取缓存失败,则返回一个504的错误响应码;如果是no-cache则只从网络中获取。
OkHttp响应过程:当正常的网络请求返回之后,CacheInterceptor会自动判断Response的Cache-Control头,如果是only-if-cache,则会缓存到本地;如果是no-cache,则不缓存。
所以,我们可以在响应返回到CacheInterceptor之前拦截Response,强制加上Cache-Control: only-if-cache,保存缓存;然后在请求发出到CacheInterceptor之前拦截Resquest,判断当前网络状态,如果无网,则强制加上Cache-Control: only-if-cache,让请求从缓存中直接获取。
关于拦截器的具体源码分析可以看我的另一篇博客:OkHttp源码解析
实现
拦截器
我们先来看看拦截器的责任链工作模式: