OkHttp
一. 曾经的网络框架
Android的网络框架有四种
- HttpClient : 2.2版本以下存在bug,所以2.3之后建议使用HttpUrlConnection
- HttpUrlConnection 2.3+, 官方推荐
- Volley,谷歌开发,简单的网络任务框架,底层兼容2.3以前版本使用了HttpClient,2.3+使用的是HttpUrlConnection,功能拓展性弱
- Okhttp,从Android4.4开始HttpURLConnection的底层实现采用的是okHttp.
优缺点

通过上面的比较,在Android发展的每个阶段,他们有各自存在的意义,只是时过境迁,被种种原因被替换或者废弃。
这个过程是一个框架发展的过程,从重量级繁杂且难以维护,到轻量级易扩展,到过度版本新老版本的兼容,最后取长补短完善自己的网络框架。
化繁为简,然后又能包容万象的过程
网络框架应该有的功能
- 自定义请求的Header
- GET,POST
- 支持文件上传下载
- 图片加载
- 支持多任务网络请求操作
- 支持缓存
- 支持回调
- 支持session
- …..
二. OkHttp简介
一张图了解OkHttp的整个过程
在OkHttp中真正核心的东西是Interceptor,他不仅负责拦截请求进行额外的处理(入cookie),实际上他还会把实际的网络请求,缓存,透明压缩等功能都统一起来,每一个功能都只是一个Interceptor,它们在连接成一个Interceptor.Chain,环环相扣最终完成一次网络请求,从getResponseWithInterceptorChain函数中我们可以看到Interceptor.Chain的分布情况依次是:
- 在配置OkHttpClinet时设置的interceptors
- 负责失败重试和重定向的RetryAndFollowUpInterceptor
- 负责把用户构造的请求转化为发送到服务器的请求,把服务器返回的响应转化为用户友好的响应BridgeInterceptor
- 负责读取缓存直接返回,更新缓存的CacheInterceptor
- 负责和服务器建立连接的ConnectInterceptor
- 配置OkHttpClient时设置的NetworkInterceptor
- 负责向服务器发送请求数据,从服务器读取响应数据的CallServerInterceptor
在这里位置决定了功能,最后一个一定是CallServerInterceptor,其他的在这之前。责任链模式在Interceptor中得到了很好的实践。对于request变成response对象,每个interceptor都能完成这件事,也由各自的inteceptor决定是否要交给下个interceptor。
三. Interceptor分析
首先看分析ConnectInterceptor和CallServerInterceptor,这两个interceptor实现了和服务器进行通信的核心
1. ConnectInterceptor建立连接
1 | /** Opens a connection to the target server and proceeds to the next interceptor. */ |
通过创建一个Exchange对象,他将在后面使用。他的内部是对http,https请求的实现,内部都是利用Okio对Socket的读写操作进行了封装.在内部是对java.io和java.nio进行了封装,内部创建了一个主要的RealConnectionn对象,利用RealConnectionn进行读写
2. CallServerInterceptor 发送和接受数据
主要过程:
- 向服务器发送request header
- 如果有request body,就向服务器发送
- 读取response header, 构造response 对象
- 如果有response body,则创建一个带body的response对象
3. CacheIntercepter 缓存
在建立连接,和服务器通讯之前就是CacheIntercepter,我们需要检查响应是否已经本地缓存了,如果缓存了则直接返回,否则进行后面的流程,并把返回的数据写入缓存
- 获取本地缓存cacheCandidate
- 如果本地缓存可用则直接返回CacheCandidate,从而打断interceptor链
- 走剩下的interceptor获取nnetworkResponse
- networkResponse、cacheResponse构造新的response
- 根据新的response里的header定制缓存策略,存入缓存中(method 为get)
总结
创建一个单例的OkHttpClient,创建请求对象request,初始化请求方式,请求url,请求header,请求body,然后通过client的newcall(request)构建真正的请求对象realcall。有realcall的execute方法和qnqueue方法区分是同步请求还是异步请求,异步请求依赖线程池dispatcher,最终会调用getResponseWithInterceptorsChain方法返回返回response。内部通过这种拦截器对request请求数据和response响应数据进行处理,每个拦截器直接通过realinterceptchain对象的process连接起来(责任链模式)