Okhttp网络框架解析
1:请求参数通过构造器模式构建
2:支持同步/异步请求
3:响应Response通过责任链模式处理不同结果
4:使用 DiskCacshe来缓存
Okhttp3 总结研究 (面试)_茶卡y的专栏-CSDN博客_okhttp面试
> 网络框架 OkHttp 拦截器
Interceptor 是 OkHttp 最核心的一个东西,不要误以为它只负责拦截请求进行一些额外的处理(例如 cookie),实际上它把实际的网络请求、缓存、透明压缩等功能都统一了起来,每一个功能都只是一个 Interceptor,它们再连接成一个 Interceptor.Chain,环环相扣,最终圆满完成一次网络请求。
责任链拦截器Interceptor:
RetryAndFollowUpInterceptor:负责失败重试以及重定向;
BridgeInterceptor:负责把用户构造的请求转换为发送到服务器的请求、把服务器返回的响应转换为用户友好的响应的;
ConnectInterceptor:建立连接;
NetworkInterceptors:配置OkHttpClient时设置的 NetworkInterceptors;
CallServerInterceptor:发送和接收数据;
Http请求行:由请求方法,URL,协议版本三部分构成,之间用空格隔开;请求方法包括:POST、GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE等;
-- Okhttp使用了DiskLruCache(DiskLruCache->LinkedHashMap)来缓存
缓存,顾名思义,也就是方便用户快速的获取值的一种储存方式。小到与CPU同频的昂贵的缓存颗粒,内存,硬盘,网络,CDN反代缓存,DNS递归查询,OS页面置换,Redis数据库,都可以看作缓存。它有如下的特点:
- 缓存载体与持久载体总是相对的,容量远远小于持久容量,成本高于持久容量,速度高于持久容量。比如硬盘与网络,目前主流的SSD硬盘可以达到500MB/S,而很多地区网速却只有4M,将网络中的文件存到硬盘中,硬盘就相当于缓存;再比如内存与硬盘,主流的DDR3内存的速度可以达到10GB/S,而硬盘相对的慢了很多数量级别,将硬盘的游戏加载到内存,内存就相对于硬盘是一种缓存。
- 需要实现
排序依据
,在java中,可以使用Comparable<T>
作为排序的的接口 - 需要一种
页面置换算法(page replacement algorithm)
将旧页面去掉换成新的页面,如最久未使用算法(LFU)、先进先出算法(FIFO)、最近最少使用算法(LFU)、非最近使用算法(NMRU)、LRU(最近最少使用算法)等 - 如果没有命中缓存,就需要从原始地址获取,这个步骤叫做“回源”,CDN厂商会标注“回源率”作为卖点
在OkHttp中,使用FileSystem
作为缓存载体(磁盘相对于网络的缓存),使用LRU作为页面置换算法(封装了LinkedHashMap)。LruCache类(在API 4之前可以使用Support Library 中的类 )特别适合缓存Bitmap, 把最近使用到的 Bitmap对象用强引用保存起来(保存到LinkedHashMap中),当缓存数量达到预定的值的时候,把不经常使用的对象删除。
OkHttp拥有2种运行方式,一种是同步阻塞调用并直接返回的形式,另一种是通过内部线程池分发调度实现非阻塞的异步回调。下面我们来看看 Okhttp第二章运行方式:通过线程池分发调度实现非阻塞异步回调