Cache-Control字段
在正式介绍CacheInterceptor拦截器之前,我们有必要复习下Cache-Control字段。因为CacheInterceptor实际上是对Cache-Control字段的逻辑实现
常见的取值及含义是
no-store | 彻底禁用缓存,所有内容都不会被缓存到缓存或临时文件中 |
no-cache | 在浏览器使用缓存前,会往返对比ETag,如果ETag没变,返回304,则使用缓存 |
public |
所有的内容都将被缓存 |
private | 缓存仅客户端可以缓存,代理服务器不可缓存 |
max-age | 缓存的内容将在xxx秒后失效,这个选项只有在http1.1可用,并如果和Last-Modified一起使用时,优先级较高 |
代码逻辑
代码分三部分
1. 进行cache和request的预处理
//首先应该留意到这个构造方法, 需要初始化一个Cache对象, 而Cache类是final类型的, 所有这个地方不需要自己实现Cache的逻辑
class CacheInterceptor(internal val cache: Cache?) : Interceptor {
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
val call = chain.call()
//从cache中获取当前的CacheResponse. 这个cacheCandidate实际上就是一个Response
val cacheCandidate = cache?.get(chain.request())
val now = System.currentTimeMillis()
//上面从cache, 即使上是从DiskLruCache中读取了CacheResponse,但是这个CacheResponse不一定可用, 可能会受到Cache Control中的
//过期等影响, 同样,原始的Request也不一定可用个, 需要利用CacheStrategy来综合判断处理过的request和cache response,也就是后面