Okhttp CacheInterceptor 拦截器源码分析

image
CacheInterceptor 缓存拦截器,完成OkHttp请求是否进行缓存工作。

在 Cache缓存put 和 Cache缓存get 分别分析OkHttp缓存的第一部分,主要是存和取的操作。

分析拦截器主要还是得到拦截器的 intercept(...) 中去分析查看。
方法中代码有些多,但是都是有主体的,一步一步向下看,首先:

image.png

先看第一段代码:

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, 到源码中去查看:

image.png

可以看到 CacheStrategy 维护了一个网络请求的 networkRequest 和一个缓存响应的 cacheResponse。在内部它通过不同的条件判断,然后指定是通过网络 networkRequest 或者缓存 cacheResponse 去获取 Response,当然条件满足的情况下两者都可以使用。

是怎么获取到的这个 CacheStrategy 对象呢?

CacheStrategy strategy = new CacheStrategy.Factory(now, chain.request(),cacheCandidate).get();

可以明白是通过 CacheStrategy 内中的工厂类 Factoryget() 方法获取到的,我们到 get() 方法中去查看:

image.png

继续到 getCandidate() 方法:
image.png

image.png

通过上面 Factory 工厂类的 getCandidate() 代码是对缓存 Response 和请求 request 进行一些判断。
再看 getCandidate() 接下来的代码:
image.png

至此我们就清楚了获取到的 CacheStrategy 对象。

Request networkRequest = strategy.networkRequest;
Response cacheResponse = strategy.cacheResponse;

然后再通过 CacheStrategy 对象分别得到了内部维护 networkRequestcacheResponse,为下面缓存拦截器的操作打下铺垫。

  • 通过各种条件判断获取到 CacheStrategy 缓存策略对象

继续回到拦截器的 intercept(...) 中去分析查看:

image.png

trackResponse(...) 方法去查看,这个方法是做了什么?
image.png

image.png

cache.trackResponse(strategy);

也就明白了 cache 对象调用 trackResponse(...) 方法,其实就是当用缓存的情况下,它会更新相关对应的统计指标,主要是缓存的命中率(使用调用缓存Response对象的次数)。

  • 更新统计指标,主要是缓存的命中率

继续向下看:

image.png

image.png
  • 通过拦截器链的 proceed(...)方法得到网络请求得到的响应体Response
image.png
  • 在缓存的Response存在的情况下,如果网络响应的Response的响应码为 304 就返回缓存的 Response ,否则就关闭缓存的 Response
image.png
  • 如果请求的头部有响应体并且满足缓存策略的条件,就将网络请求的响应 ResponseCacheput(...) 方法写入缓存

到此 CacheInterceptor 就分析完了。

你可能感兴趣的:(Okhttp CacheInterceptor 拦截器源码分析)