学习自https://yq.aliyun.com/articles/78102?spm=a2c4e.11153940.blogcont78105.14.785137beBUL1wW
温馨提示
在熟练掌握HTTP协议后,会看起来很舒服,因为就是HTTP协议的东西在Andorid中的实现
CacheIntercept
他的缓存机制自然离不开缓存拦截器了
Cache类
内部有一个disk lru cache,判断指标是requestCount,networkCount,hitCount
大意应该是,我们发起请求的次数,发起请求越过了本地缓存成功到达互联网的次数(也就是没有用强制缓存的次数),我们成功在缓存中找到该缓存的次数
CacheStrategy类
内部维护一个request和response,通过他们来描述我们的数据是从缓存获取还是从网络获取,抑或同时使用
CacheIntercept的intercept方法大体逻辑
先根据我们的request去找缓存的response
再根据我们的request去找缓存策略,找到策略了,在缓存中更新hitcount
如果我们的缓存response不符合策略,对response的body进行一个手动的关闭
如果没网,且没符合的缓存,504
如果没网,但是有符合的缓存,返回缓存
进行真正网络请求
(下面是对比缓存逻辑)
当有缓存的时候,如果服务端NOT_MODIFIED,则使用缓存,否则就更新缓存
缓存策略的大体逻辑
如果本地没缓存,发起网络请求
如果是HTTPS,但是没有进行TLS握手,需要重新发起网络请求
如果缓存策略为不缓存或者是对比缓存,发起网络请求
缓存age(时间点)与fresh(缓存有效时间段)时间
如果 age + min-fresh >= max-age && age + min-fresh < max-age + max-stale,则虽然缓存过期了,但是缓存继续可以使用,只是在头部添加110警告码
DiskLruCache管理日志不用多看,只需要知道一个读写分离即可