美文网首页
OkHttp的缓存

OkHttp的缓存

作者: littleGrow | 来源:发表于2018-10-31 15:39 被阅读0次

OkHttp版本:3.11.0

OkHttp的enqueue方法其实执行的是Dispatcher的enqueue方法。在Disptcher中有两个Deque,一个运行Deque,一个待运行的Deque。如果运行队列的长度小于最大请求数64和请求的url主机数量小于请求的最大主机数5(即在一个运行队列中最多允许同时访问4个不同的url),将创建的AsyncCall加入到运行队列,并放到线程池中去执行,否则加入到待运行队列。运行队列执行完成后,若运行队列的的长度小于64,则从待运行队列中取出AsyncCall,加入到运行队列去线程池中执行。

其中真正执行的是RealCall中的execute方法,在此方法的getResponseWithInterceptorChain方法中我们发现了拦截器的踪迹:

图1

 在图1中我们可以看出在一系列拦截器处理后得到了Response,所以OkHttp的缓存必然在这一系列的拦截器中,我们继续去寻找。

在OkHttpClient中我们发现其实OkHttp并没有默认的缓存,如果想要实现缓存,需要我们自己创建Cache或者去实现InternalCache,不过更建议我们直接创建Cache对象,并把它设置到OkHttpClient中。接下来我们假设设置了Cache,然后通过CacheInterceptor和Cache的源码去查找。

Cache如何实现的?

图2

图2中体现了如何才能使用缓存,首页服务器返回的结果要支持缓存,请求中也要支持缓存即在请求的Header中要设置成支持缓存,具体可看CacheControl的parse(Headers headers)方法。在支持缓存的基础上,要看是否在缓存的有效期内,若在则返回缓存,不在则重新请求,请求成功后将结果添加到缓存中cache.put(response),具体详见CacheInterceptor的intercept方法。

接着我们去看Cache的源码,去寻找如何保存与取出Response。

Cache中使用的是DiskLruCache,使其内部使用LinkedHashMap去保存key和缓存的请求结果。其中key用utf-8格式的url的md5值的十六进制编码

public static String key(HttpUrl url) {

  return ByteString.encodeUtf8(url.toString()).md5().hex();

}

在Android中常用的缓存LruCache的源码,可以参考文章: LruCache源码 - 简书

相关文章

网友评论

      本文标题:OkHttp的缓存

      本文链接:https://www.haomeiwen.com/subject/onpgtqtx.html