关于OkHttp支持Post缓存的解决方案
安卓技术学习图谱(持续更新中,欢迎关注)
https://github.com/Sakuragi/android-summary
无网的时候读取本地缓存,有网的情况下更新缓存。
注:本文只是给了post的缓存的一种解决思路,具体的本地持久化策略还需读者自己实现
默认情况下,一般认为使用GET通过HTTP访问的请求可以缓存,也应当缓存。使用HTTPS或POST访问的请求不应当缓存。OKHttp也是这样设计的,OKHttp默认不支持Post缓存。那么我们该如何来设计使OKHttp支持POST缓存呢?
大致有这么几种持久化方式:
结合OKHttp的源码,我们发现OKHttp也是使用了DiskLruCache进行GET请求缓存的。我们首先来看看OkHttp是怎么进行缓存的。
当OKHttp执行excute时:
通过源码可以看到它通过getResponseWithInterceptorChain()方法得到响应,这个方法是通过一个一个拦截器,以责任链模式发起请求获得响应,来进一步看这个方法:
在这里面我们可以看到添加了一个缓存拦截器interceptors.add(new CacheInterceptor(client.internalCache())),继续跟踪进去:
我们来看这个缓存拦截器的实现方式:主要分三步:
第一步:首先判断用户是否设置缓存,如果有的话读出缓存
第二部:根据CacheStrategy缓存策略,判断是否需要网络请求,如果networkRequest为空则说明不需要网络请求,直接返回当前缓存
第三步:获取网络请求,如果缓存不为空,调用validate进行验证,是否需要更新缓存,如果缓存为空,则保存当前缓存。
根据这个实现步骤,我们可以模仿拦截器实现网络缓存: