addInterceptor与addNetworkInterceptor有什么区别 ?
网络缓存如何实现的?
网络连接怎么实现复用?
OkHttp如何做网络监控?
缓存机制CacheInterceptor
okhttp 的缓存策略是,key 为 Request的 url 的 MD5 值,value 为 response。
- 如果在 okhttpclient 初始化的时候配置了 cache,那么我们则从缓存中读取 caseResponse。
- 如果没有指定,那么我们将 request 和 caseResponse 构建一个 CacheStrategy 的类
- 判断 cachestrategy 是否有效,如果 request 和 caseResponse 都为空,直接返回 504
- 如果 request == null ,cacheResponse 不为空,则返回
- 如果为空,那么我们就进行网络请求,如果返回了 304 且我们本地有缓存,那么说明我们的缓存没有过期,可以继续使用
多路复用
TCP/IP 请求是需要握手的,那握手就会消耗相应的时间,所以在我们的 okhttp 中,我们会复用之前的链接进行请求,这样请求速度就快了很多。
复用
- 如果此链接的负载数目超过指定数目(表现为RealConnection的allocations集合的数量超过该链接指定的数量)或者noNewStreams为true时,此链接不可复用。
- StreamAllocation 所持有的Address对象和RealConnection的Address非主机部分不同,则此链接不可复用。至于非主机部分的判定是在Address的equalsNonHost方法来体现。两者Adress对象的非主机部分相等的标准就是dns,Authenticator对象、协议、CA授权验证标准、端口等信息全部相等。
- 在1、2判定条件都为true的话,如果两个Address对象的host或者说url中的host一样,则此链接可复用,正如注释说说,添加1、2、3都满足的话,那么此时这个链接就是This connection is a perfect match。
清理
标记清除法
- 首先标记出最不活跃的链接(空闲链接),之后进行清除
- 如果被标记的链接空闲 socket 超过 5 个,时间大于 5 分钟,那么直接清除。
- 如果此链接空闲,但是不足五分钟,则返回剩余时间,并进行标记,以供下次清除。
- 如果没用空闲链接的话,则五分钟之后再进行清理
判断是否为空闲链接:
- 遍历其中的 StreamAllocation,判断是否为空,如果为空,则没有引用这个 StreamAllocation
- 如果引用数量为 0 ,则为空闲链接