OkHttp作为现在最主流的Android网络请求框架,其先进的设计思想是很值得学习的。今天就来从源码角度解读一下OkHttp网络框架的原理。
首先来看看OkHttp网络框架特点。
OkHttp 是一个高效的 HTTP 客户端,具有非常多的优势:
- 能够高效的执行 http,数据加载速度更快,更省流量
- 支持 GZIP 压缩,提升速度,节省流量
- 缓存响应数据,避免了重复的网络请求
- 使用简单,支持同步阻塞调用和带回调的异步调用
接下来让我们看看源码,首先从一个GET请求开始。
我们看到使用OkHttp网络框架发送一个GET请求其实还蛮简单的。
第一步,创建一个OkHttpClient对象。
第二步,建立一个Request请求,同时赋予参数url地址以及方式如GET/POST。
第三步,建立一个Call对象。
第四步,调用call对象的enqueue方法,同时建立请求失败与成功响应函数。
第一步建立OkHttpClient对象其实没什么好说的,里面运用了建造者模式。
通过重载的构造方法可以看出它的参数是支持配置的。
第二步,Request的建立这部分大体就是一个链式构建调用。
第三步,建立Call对象也比较简单。调用newCall底层调用RealCall返回一个RealCall对象。
第四步,这三张图一起看。
Call对象的enqueue方法底层调用了client中的dispatcher里的enqueue方法。而参数又经过了一层AsyncCall对象的包装。从此也可以看出是异步的调用。
既然到这里提到了异步,那么我们再看一眼同步。
同步的这三张图一起看。
直接调用了call对象的execute方法。里面又调用了client中的dispatcher的executed方法。
最后看到底层实际上是调用了runningSyncCalls的add方法。
简单地说,就是最终加到了相应的异步/同步请求队列中。
注意,加入队列后,调用了getResponseWithInterceptorChain方法来获取response。
而这个InterceptorChain就是OkHttp比较核心的一个设计,拦截器机制。
我们看到这个方法里添加了一堆拦截器,最后调用了RealInterceptorChain方法。
拦截器Chain这部分比较乱,但是核心思想一定要搞明白。
RealInterceptorChain这个类从始至终都是一个,它持有了拦截器集合。并且它里面有一个proceed方法。
这个方法里比较重要的是RealInterceptorChain next这段代码以及后面的Response resonse = interceptor.intercept(next)
这里面next的建立是调用了index +1 ,实际上就是把这个ArrayList的索引+1,调用下一个拦截器。
这里截取了桥拦截器和缓存拦截器的部分代码。都是它们的intercept方法中的代码。
我们可以看到,每个拦截器的intercept的代码中一定会有chain.proceed方法。因为只有这样才能够完成递归逐层调用。
按照拦截器的优先级,逐层遍历,若某一层满足条件,则返回response结果停止next的调用。
不得不说这个设计真的巧妙。
之后再看一眼异步请求的发送。
我们看到异步请求的发送是交给了线程池来发送。
而封装的这个AsyncCall实际上内部的execute方法还是调用了getResponseWithInterceptorChain来获取response。
这与之前分析的逻辑是一样的。
OkHttp的强大之处还有很多,而且其中的细节想要吃透还需要好好研究。
这里只是把简单的网络请求流程过一遍,也算是读读源码,了解一下基础知识吧。
最后,发现了一篇OkHttp分析的不错的文章,可以参考学习。