怎么用(图示):
小案例-
2.从以上实现的方式上去分析一下原理:
Request:
Request类主要作用是封装请求部分,主要是对HttpUrl Headers RequestBody的封装,便于调用使用了builder模式去封装了一系列的方法,分别对请求的头部和url requestBody地址做了单独封装处理。
不过headers数量不能超过20。
requestBody可能比较有趣的地方就是MediaType,在需要传文件的时候就会用到这个
OkhttpClient:
它的作用非常明显,就是call的工厂类,网络请求和回调都在这个类中操作完成,这个类依然用到了builder模式,方便我们一气呵成写完请求:
把request写好之后传入的就是okhttpclient的newcall方法:
这个实际是把request传入了RealCall里面去执行
RealCall实现了Call接口,实际上通过okhttpClient去实现请求回调都是在Call的接口方法中实现的:
执行execute会首先检查是否执行,此处用到了原子布尔对象executed。然接着分发执行然后返回getResponseWithInterceptorChain的response得到请求的结果Response。然而这只是一个请求过程的整体封装,实际的请求部分外面封装在RealConnection中:
然而,实际网络连接是在Platfom中:
当然其实分析到这儿大概已经知道okhttp底层的原理了,是用socke去操作,然而并没有完。我们在调用okhttpClient执行请求调用了newCall之后会调用excute()这个方法,而这个方法实际是在RealCall里面执行实际是调用了getResponseWithInterceptorChain在这个方法里面
添加了非常多的拦截器,这些拦截器都是实现了Interceptor这个接口:
在ConnectInterceptor这个拦截器里面调用了RealCall里面初始化了的ExchangeFinder类的find方法,这个类也是一个封装类,作用如下:
这个类里面其实就一个关键方法的寻找连接的方法:
在寻找过程中会跟RealCall进行交互对网路连接情况进行操作比如取消请求,这个类继承自RealConnection,显而易见又跑到去调用Platform类的调用socket去处理网络了。。这个框架内容很多,这只是非常微小的一部分原理,这个框架可以说是把网络请求细化到非常细小的一部分,然后对每一部分进行了非常有意思的协调 控制实现有效率的网络请求。。后面又出了一个Retrofit,相比起来比较不一样的地方就是Retrofit使用了注解去简化了对请求的header 方法等的操作让网络请求看起来更简洁,但是底层还是调用了okhttp的这些方法去执行网络请求。