CacheInterceptor 缓存拦截器,完成OkHttp请求是否进行缓存工作。
在 Cache缓存put 和 Cache缓存get 分别分析OkHttp缓存的第一部分,主要是存和取的操作。
分析拦截器主要还是得到拦截器的 intercept(...) 中去分析查看。
方法中代码有些多,但是都是有主体的,一步一步向下看,首先:
先看第一段代码:
Response cacheCandidate = cache != null
? cache.get(chain.request())
: null;
- 通过 cache 对象尝试去获取缓存 Reaponse 。(两种情况:一种是得到了缓存 Response;一种是为 null)
继续看下面的一段代码:
CacheStrategy strategy = new CacheStrategy.Factory(now, chain.request(),cacheCandidate).get();
Request networkRequest = strategy.networkRequest;
Response cacheResponse = strategy.cacheResponse;
CacheStrategy—缓存策略,先了解下 CacheStrategy, 到源码中去查看:
可以看到 CacheStrategy 维护了一个网络请求的 networkRequest 和一个缓存响应的 cacheResponse。在内部它通过不同的条件判断,然后指定是通过网络 networkRequest 或者缓存 cacheResponse 去获取 Response,当然条件满足的情况下两者都可以使用。
是怎么获取到的这个 CacheStrategy 对象呢?
CacheStrategy strategy = new CacheStrategy.Factory(now, chain.request(),cacheCandidate).get();
可以明白是通过 CacheStrategy 内中的工厂类 Factory 的 get() 方法获取到的,我们到 get() 方法中去查看:
继续到 getCandidate() 方法:
通过上面 Factory 工厂类的 getCandidate() 代码是对缓存 Response 和请求 request 进行一些判断。
再看 getCandidate() 接下来的代码:
至此我们就清楚了获取到的 CacheStrategy 对象。
Request networkRequest = strategy.networkRequest;
Response cacheResponse = strategy.cacheResponse;
然后再通过 CacheStrategy 对象分别得到了内部维护 networkRequest 和 cacheResponse,为下面缓存拦截器的操作打下铺垫。
- 通过各种条件判断获取到 CacheStrategy 缓存策略对象
继续回到拦截器的 intercept(...) 中去分析查看:
到 trackResponse(...) 方法去查看,这个方法是做了什么?
cache.trackResponse(strategy);
也就明白了 cache 对象调用 trackResponse(...) 方法,其实就是当用缓存的情况下,它会更新相关对应的统计指标,主要是缓存的命中率(使用调用缓存Response对象的次数)。
- 更新统计指标,主要是缓存的命中率
继续向下看:
- 通过拦截器链的 proceed(...)方法得到网络请求得到的响应体Response
- 在缓存的Response存在的情况下,如果网络响应的Response的响应码为 304 就返回缓存的 Response ,否则就关闭缓存的 Response
- 如果请求的头部有响应体并且满足缓存策略的条件,就将网络请求的响应 Response 进 Cache 的 put(...) 方法写入缓存
到此 CacheInterceptor 就分析完了。