关于OkHttp支持Post缓存的解决方案

 我来答
户如乐9318
2022-06-26 · TA获得超过6672个赞
知道小有建树答主
回答量:2559
采纳率:100%
帮助的人:141万
展开全部

安卓技术学习图谱(持续更新中,欢迎关注)
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进行验证,是否需要更新缓存,如果缓存为空,则保存当前缓存。

根据这个实现步骤,我们可以模仿拦截器实现网络缓存:

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式