1、max-age是啥,maxStale是啥,他们的区别是啥?
maxAge和maxStale的区别在于:
maxAge:没有超出maxAge,不管怎么样都是返回缓存数据,超过了maxAge,发起新的请求获取数据更新,请求失败返回缓存数据。
maxStale:没有超过maxStale,不管怎么样都返回缓存数据,超过了maxStale,发起请求获取更新数据,请求失败返回失败
2、为什么没有网络的情况下,request要cacheControl.FORCE_CACHE
public static final CacheControl FORCE_CACHE = new Builder().onlyIfCached()
.maxStale(Integer.MAX_VALUE, TimeUnit.SECONDS).build();
可以看到FORCE_CACHE是设置了maxStale的最大时间为interger的最大时间,所以,意思就是无论如何,都不会超过这个时间,所以就是一直(强制)拿缓存,也是想要实现缓存的正确逻辑
3、addNetInterceptor和addInterceptor有什么区别?
addNetInterceptor是添加网络拦截器,addInterceptor是添加应用拦截器,如果看到okhttp的流程分析的知道:应用拦截器是在网络拦截器前执行的。
如果我使用的是addNetInterceptor:
1、有网的情况下,可以在期限内拿到缓存,而没有去请求接口(通过测试数据库的数据改动来判断的)
2、没有网的情况下,直接就ConnectException了,根本不会走到interceptor里面去了。(网上很多人都提出了这样的问题)
如果我使用的是addInterceptor:
1、有网的情况下,明明设置的是60秒,但是每次都没有去拿缓存而都是请求的接口。(通过测试数据库的数据改动来判断的)
2、没有网的情况下,可以拿到缓存数据(猜想:可能是因为应用拦截器在网络拦截器前执行,没有网的情况下,本身就执行不到网络拦截器里面去),但是缓存过期时间是“永久”,因为FORCE_CACHE里面已经设置为了integer的最大值,21亿秒左右,堪称永久
但是,依旧没有办法控制无网时候的缓存过期时间
面对这些个问题,我也是很无奈。只得不停地尝试,不停地摸索。于是就在尝试的过程中发现了它的一些规则,于是最终写出了一个自认为“万全”的方法。
既然想要有网的情况下拿缓存,那么就需要addNetInterceptor,如果需要无网的情况下拿缓存,就需要addInterceptor,所以不如直接做两个interceptor吧!
另外,如果想要控制有网的时候不去读取缓存,可以直接通过在response里设置maxAge=0来实现。
这里通过大量实验发现,只有在request去设置其maxStale才能控制无网时候的缓存时间,在response里面去控制是不行的!
延伸
如果无网的时候,stale缓存时间过了,会怎么样呢?
会报504错误(属于正常的逻辑)。
原作者:Jafir
链接:https://www.jianshu.com/p/dbda0bb8d541