OkHttp源码解析

OkHttp作为现在最主流的Android网络请求框架,其先进的设计思想是很值得学习的。今天就来从源码角度解读一下OkHttp网络框架的原理。

首先来看看OkHttp网络框架特点。

OkHttp 是一个高效的 HTTP 客户端,具有非常多的优势:

  1. 能够高效的执行 http,数据加载速度更快,更省流量
  2. 支持 GZIP 压缩,提升速度,节省流量
  3. 缓存响应数据,避免了重复的网络请求
  4. 使用简单,支持同步阻塞调用和带回调的异步调用

 

 

接下来让我们看看源码,首先从一个GET请求开始。

OkHttp源码解析_第1张图片

我们看到使用OkHttp网络框架发送一个GET请求其实还蛮简单的。

第一步,创建一个OkHttpClient对象。

第二步,建立一个Request请求,同时赋予参数url地址以及方式如GET/POST。

第三步,建立一个Call对象。

第四步,调用call对象的enqueue方法,同时建立请求失败与成功响应函数。

OkHttp源码解析_第2张图片

第一步建立OkHttpClient对象其实没什么好说的,里面运用了建造者模式。

通过重载的构造方法可以看出它的参数是支持配置的。

OkHttp源码解析_第3张图片

OkHttp源码解析_第4张图片

OkHttp源码解析_第5张图片

第二步,Request的建立这部分大体就是一个链式构建调用。

OkHttp源码解析_第6张图片

OkHttp源码解析_第7张图片

第三步,建立Call对象也比较简单。调用newCall底层调用RealCall返回一个RealCall对象。

OkHttp源码解析_第8张图片

OkHttp源码解析_第9张图片

OkHttp源码解析_第10张图片

第四步,这三张图一起看。

Call对象的enqueue方法底层调用了client中的dispatcher里的enqueue方法。而参数又经过了一层AsyncCall对象的包装。从此也可以看出是异步的调用。

既然到这里提到了异步,那么我们再看一眼同步。

OkHttp源码解析_第11张图片

OkHttp源码解析_第12张图片

同步的这三张图一起看。

直接调用了call对象的execute方法。里面又调用了client中的dispatcher的executed方法。

最后看到底层实际上是调用了runningSyncCalls的add方法。

简单地说,就是最终加到了相应的异步/同步请求队列中。

注意,加入队列后,调用了getResponseWithInterceptorChain方法来获取response。

而这个InterceptorChain就是OkHttp比较核心的一个设计,拦截器机制。

OkHttp源码解析_第13张图片

我们看到这个方法里添加了一堆拦截器,最后调用了RealInterceptorChain方法。

OkHttp源码解析_第14张图片

OkHttp源码解析_第15张图片

拦截器Chain这部分比较乱,但是核心思想一定要搞明白。

RealInterceptorChain这个类从始至终都是一个,它持有了拦截器集合。并且它里面有一个proceed方法。

这个方法里比较重要的是RealInterceptorChain next这段代码以及后面的Response resonse = interceptor.intercept(next)

这里面next的建立是调用了index +1 ,实际上就是把这个ArrayList的索引+1,调用下一个拦截器。

OkHttp源码解析_第16张图片

OkHttp源码解析_第17张图片

这里截取了桥拦截器和缓存拦截器的部分代码。都是它们的intercept方法中的代码。

我们可以看到,每个拦截器的intercept的代码中一定会有chain.proceed方法。因为只有这样才能够完成递归逐层调用。

按照拦截器的优先级,逐层遍历,若某一层满足条件,则返回response结果停止next的调用。

不得不说这个设计真的巧妙。

之后再看一眼异步请求的发送。

OkHttp源码解析_第18张图片

OkHttp源码解析_第19张图片

我们看到异步请求的发送是交给了线程池来发送。

而封装的这个AsyncCall实际上内部的execute方法还是调用了getResponseWithInterceptorChain来获取response。

这与之前分析的逻辑是一样的。

OkHttp的强大之处还有很多,而且其中的细节想要吃透还需要好好研究。

这里只是把简单的网络请求流程过一遍,也算是读读源码,了解一下基础知识吧。

 

最后,发现了一篇OkHttp分析的不错的文章,可以参考学习。

OkHttp网络框架源码理解分析

 

 

你可能感兴趣的:(Android面试)