okhttp builder_OKhttp原理分析(1)

  1. 怎么用(图示):

    小案例-

4e57083d68ff0a65d73fffff9be468df.png

2.从以上实现的方式上去分析一下原理:

 Request:

3f52490f36257540cb7699778dad294f.png

Request类主要作用是封装请求部分,主要是对HttpUrl Headers RequestBody的封装,便于调用使用了builder模式去封装了一系列的方法,分别对请求的头部和url requestBody地址做了单独封装处理。

96d7bfaac32392635e0f4dec28751db4.png

0991e13a7411f25cd39f2b83c991982c.png

不过headers数量不能超过20。

b1d836d1f5a97f9c896e8af2df89108c.png

8ab17789968e6df8b89208449722540b.png

requestBody可能比较有趣的地方就是MediaType,在需要传文件的时候就会用到这个

0789f6a97eff24bcdab2a20c0075b8f8.png

OkhttpClient:

b5732036f12effe9def07c1c1177eb90.png

它的作用非常明显,就是call的工厂类,网络请求和回调都在这个类中操作完成,这个类依然用到了builder模式,方便我们一气呵成写完请求:

89e0630ad6aabaf2c1f5d396e95e88ea.png

把request写好之后传入的就是okhttpclient的newcall方法:

14e83d5f8aa2881ed4807b7d2a9944a1.png

这个实际是把request传入了RealCall里面去执行

27dad3609e4ac78c2843ca0bbe821aef.png

RealCall实现了Call接口,实际上通过okhttpClient去实现请求回调都是在Call的接口方法中实现的:

9cc78ca12e2ed304822ee44c0d99dd64.png

执行execute会首先检查是否执行,此处用到了原子布尔对象executed。然接着分发执行然后返回getResponseWithInterceptorChain的response得到请求的结果Response。然而这只是一个请求过程的整体封装,实际的请求部分外面封装在RealConnection中:

31b2aa2d45e090ec4756c76ff66fb43a.png

然而,实际网络连接是在Platfom中:

cec4805d6b907753616ba0cb1831e4a2.png

当然其实分析到这儿大概已经知道okhttp底层的原理了,是用socke去操作,然而并没有完。我们在调用okhttpClient执行请求调用了newCall之后会调用excute()这个方法,而这个方法实际是在RealCall里面执行实际是调用了getResponseWithInterceptorChain在这个方法里面

4f9e4208ce38048847e1c1e371c93daa.png添加了非常多的拦截器,这些拦截器都是实现了Interceptor这个接口:

e21f5dc40518d1d556605171266d685d.png

在ConnectInterceptor这个拦截器里面调用了RealCall里面初始化了的ExchangeFinder类的find方法,这个类也是一个封装类,作用如下:

40548bd97f8eb99c87c8429dd5d0615e.png

这个类里面其实就一个关键方法的寻找连接的方法:

d8cfa042d1efa9ab3a198fd75066db1e.png

在寻找过程中会跟RealCall进行交互对网路连接情况进行操作比如取消请求,这个类继承自RealConnection,显而易见又跑到去调用Platform类的调用socket去处理网络了。。这个框架内容很多,这只是非常微小的一部分原理,这个框架可以说是把网络请求细化到非常细小的一部分,然后对每一部分进行了非常有意思的协调 控制实现有效率的网络请求。。后面又出了一个Retrofit,相比起来比较不一样的地方就是Retrofit使用了注解去简化了对请求的header 方法等的操作让网络请求看起来更简洁,但是底层还是调用了okhttp的这些方法去执行网络请求。

f694d2c302929be866b32f69315e0c01.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值