框架
一、目录
二、目的
源码阅读的目的
1.发生请求的过程
2.接收响应的过程
3.网络操作的实现
4.缓存的实现
5.多路复用的实现
三、总体框架
上图是OkHttp的总体架构,大致可以分为以下几层:
1.Interface——接口层:接收网络的请求
2.Protocol——协议层:处理协议逻辑
3.Connection——连接层:管理网络连接,发送新的请求,接收服务器访问
4.Cache——缓存层:管理本地缓存
5.I/O层:实现数据的读写
6.Inteceptor——拦截层:拦截网络访问,插入拦截逻辑
四、每层含义
1.接口层——Interface
接口层接收用户的网络访问请求(异步/同步),发起实际的网络访问请求。OKHttpClient是OkHttp框架的客户端,更确切的说是用户的面板。用户使用OKHttp进行各种设置,发起各种网络请求都是通过OKHttpClient完成的。每个OkHttpClient内部都维护了属于自己的任务队列,连接池,Cache,拦截器等,所以在使用OkHttp作为网络框架时应该全局共享一个OkHttpClient实例。
Call描述了一个实际的访问请求,用户的每一个网络请求都是一个Call实例,Call本身是一个接口,定义了Call的接口方法,在实际执行过程中,OkHttp会为每一个请求创建一个RealCall,即Call的实现类。
Dispatcher是OkHttp的任务队列,其内部维护了一个线程池,当有接收到一个Call时,Dispatcher负责在线程池中找到空闲的线程并执行其execute方法。
2.协议层:处理协议逻辑——Protocol
Protocol层负责处理协议逻辑,OkHttp支持Http1/Http2/WebSocket协议,并在3.7版本中放弃了对Spdy协议,鼓励开发者使用Http/2。
3.连接层:管理网络连接,发送新的请求,接收服务器访问——Connection
连接层顾名思义就是负责网络连接,在连接层有一个线程池,统一管理所有Socke连接,当用户发起一个新的网络请求时,OKHttp会在连接池中找到是否有符合要求的连接,如果有则直接通过该连接发送网络请求;否则新创建一个网络连接。
RealConnection描述的是一个物理Socket连接,连接池中维护多个RealConnection实例,由于Http/2支持多路复用,一个RealConnection,所以OKhttp又引用了StreamAllocation来描述一个实际的网络请求开销(从逻辑上一个Stream对应一个call,但在实际网络请求过程中一个Call常常涉及到多个请求。如重定向,Authenticate等场景。所以准确地说,一个Stream对应一次请求,而一个Call对应一组有逻辑关联的Stream),一个RealConnection对应一个或者多个StreamAllocation,所以StreamAllocation,是以StreamAllocation可以看做是RealConnection的计数器,当RealConnection的引用计数变为0,且长时间没有被其他请求重新占用就将被释放。
4.缓存层:管理本地缓存——Cache
Cache层负责维护请求缓存,当用户的网络请求在本地已有符合要求的缓存时,OKHttp会直接从缓存中返回结果,从而节省 网络开销。
5.拦截器层:拦截网络访问,插入拦截逻辑——Inteceptor
拦截层提供一个类AOP接口,方便用户可以切入到各个层面对网络访问进行拦截并执行相关逻辑。