OkHttp介绍
OkHttp是当下Android使用最频繁的网络请求框架,由Square公司开源。Google在Android4.4以后开始将源码中的HttpURLConnection底层实现替换为OKHttp,同时现在流行的Retrofit框架底层同样是使用OKHttp的
优点:
- 支持Spdy、Http1.X、Http2、Quic以及WebSocket
- 连接池复用底层TCP(Socket),减少请求延时
- 无缝的支持GZIP减少数据流量
- 缓存响应数据减少重复的网络请求
- 请求失败自动重试主机的其他ip,自动重定向
分发器
异步请求
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qh8uGfXc-1652277849779)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20220509212958065.png)]](/https://i-blog.csdnimg.cn/blog_migrate/1e055d89db11200b5a0c042289cf98d3.png)
第一行代码:第一次进入会给值改为true 第二次进入会抛出异常
enqueue():
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nYOiQPs7-1652277849781)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20220509214356863.png)]](/https://i-blog.csdnimg.cn/blog_migrate/dfe700a29d668a29c264b336c8a4cf95.png)
promoteAndExecute()
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fOwjBgSJ-1652277849782)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20220509214935086.png)]](/https://i-blog.csdnimg.cn/blog_migrate/623f74f42c8ffb2c000a9ef869ffb9ea.png)
异步请求分发流程
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uGOI46YW-1652277849783)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20220509221810932.png)]](/https://i-blog.csdnimg.cn/blog_migrate/4d4bc9067b60d3ebbec18bae5d814923.png)
Q: 如何决定将请求放入ready还是running?
A: 如果当前正在请求数为64,则将请求放入ready等待执行;如果小于64,但是已经存在同一域名主机的
请求5个,也会放入ready;否则放入running队列立即执行;
Q: 从Ready移动到Running的条件是什么?
A: 每个请求执行完成就会从running移除,同时进行第一步相同逻辑的判断,决定是否移动!
Q: 分发器线程池是怎么定义的?
A:无等待,最大并发。
处理同步请求
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7oiR3Cuf-1652277849784)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20220511203408017.png)]](/https://i-blog.csdnimg.cn/blog_migrate/5caa7fb4ed092c746ea1d971fbbbb4d7.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e2vFRqll-1652277849784)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20220511203421678.png)]](/https://i-blog.csdnimg.cn/blog_migrate/d43ef69023bd3578dc0636d5d3833b10.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sogEcmmC-1652277849785)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20220511203448896.png)]](/https://i-blog.csdnimg.cn/blog_migrate/9ebf950d70dbcb01ca90b58d4723ef2e.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x67oQ9NZ-1652277849786)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20220511203726924.png)]](/https://i-blog.csdnimg.cn/blog_migrate/6148904d789c2a6808fe1b9a3e7f776a.png)
然后执行一系列的拦截器
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-62njdBMn-1652277849787)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20220511203742495.png)]](/https://i-blog.csdnimg.cn/blog_migrate/6e6984756b848322aef1b51b2d73d1b2.png)
拦截器(责任链设计模式)
责任链模式:
对象行为型模式,为请求创建了一个接收者对象的链,在处理请求的时候执行过滤(各司其职)。 责任链上的处理者负责处理请求,客户只需要将请求发送到责任链即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fKMiZbf8-1652277849787)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20220511204820095.png)]](/https://i-blog.csdnimg.cn/blog_migrate/e5bdab7d4ae20e5251d545b8ef826181.png)
执行流程
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z2QDEd7s-1652277849788)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20220511204024626.png)]](/https://i-blog.csdnimg.cn/blog_migrate/a5483cb8420040c7ba6494b588db7f62.png)
拦截器责任链
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lpWUKtPU-1652277849789)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20220511205235518.png)]](/https://i-blog.csdnimg.cn/blog_migrate/5607ac0be99b2d9990e1d5cda5ee0176.png)
拦截器概述
-
(RetryAndFollowUpInterceptor)重试拦截器在交出(交给下一个拦截器)之前,负责判断用户是否取消了请求;在获得了结果之后
会根据响应码判断是否需要重定向,如果满足条件那么就会重启执行所有拦截器。
-
(BridgeInterceptor)桥接拦截器在交出之前,负责将HTTP协议必备的请求头加入其中(如:Host)并添加一些默认
的行为(如:GZIP压缩);在获得了结果后,调用保存cookie接口并解析GZIP数据。
-
(CacheInterceptor)缓存拦截器顾名思义,交出之前读取并判断是否使用缓存;获得结果后判断是否缓存。
-
(ConnectInterceptor)连接拦截器在交出之前,负责找到或者新建一个连接,并获得对应的socket流;在获得结果后 不进行额外的处理。
-
(CallServerInterceptor)请求服务器拦截器进行真正的与服务器的通信,向服务器发送数据,解析读取的响应数据。
OkHttp总结
整个OkHttp功能的实现就在这五个默认的拦截器中,所以先理解拦截器模式的工作机制是先决条件。这五个拦截器分别为: 重试拦截器、桥接拦截器、缓存拦截器、连接拦截器、请求服务拦截器。每一个拦截器负责的工作不一样,就好像工厂流水线,最终经过这五道工序,就完成了最终的产品。
但是与流水线不同的是,OkHttp中的拦截器每次发起请求都会在交给下一个拦截器之前干一些事情,在获得了结果之后又干一些事情。整个过程在请求向是顺序的,而响应向则是逆序。
当用户发起一个请求后,会由任务分发起Dispatcher将请求包装并交给重试拦截器处理。
1、重试拦截器在交出(交给下一个拦截器)之前,负责判断用户是否取消了请求;在获得了结果之后,会根据响应码判断是否需要重定向,如果满足条件那么就会重启执行所有拦截器。
2、桥接拦截器在交出之前,负责将HTTP协议必备的请求头加入其中(如:Host)并添加一些默认的行为(如:GZIP压缩);在获得了结果后,调用保存cookie接口并解析GZIP数据。
3、缓存拦截器顾名思义,交出之前读取并判断是否使用缓存;获得结果后判断是否缓存。
4、连接拦截器在交出之前,负责找到或者新建一个连接,并获得对应的socket流;在获得结果后不进行额外的处理。
5、请求服务器拦截器进行真正的与服务器的通信,向服务器发送数据,解析读取的响应数据。
在经过了这一系列的流程后,就完成了一次HTTP请求!
问题解答
Q:Okhttp请求流程是?
Q:OKHttp分发器是怎么工作的?
Q:OKHttp拦截器是怎么工作的?
Q:应用拦截器和网络拦截器有什么区别?

1856

被折叠的 条评论
为什么被折叠?



