OKHttp源码分析

OkHttp介绍

OkHttp是当下Android使用最频繁的网络请求框架,由Square公司开源。Google在Android4.4以后开始将源码中的HttpURLConnection底层实现替换为OKHttp,同时现在流行的Retrofit框架底层同样是使用OKHttp的

优点:

  • 支持Spdy、Http1.X、Http2、Quic以及WebSocket
  • 连接池复用底层TCP(Socket),减少请求延时
  • 无缝的支持GZIP减少数据流量
  • 缓存响应数据减少重复的网络请求
  • 请求失败自动重试主机的其他ip,自动重定向

分发器

异步请求

OKHttp源码分析_第1张图片

第一行代码:第一次进入会给值改为true 第二次进入会抛出异常

enqueue():

OKHttp源码分析_第2张图片

promoteAndExecute()

OKHttp源码分析_第3张图片

异步请求分发流程

OKHttp源码分析_第4张图片

Q: 如何决定将请求放入ready还是running?

A: 如果当前正在请求数为64,则将请求放入ready等待执行;如果小于64,但是已经存在同一域名主机的

请求5个,也会放入ready;否则放入running队列立即执行;

Q: 从Ready移动到Running的条件是什么?

A: 每个请求执行完成就会从running移除,同时进行第一步相同逻辑的判断,决定是否移动!

Q: 分发器线程池是怎么定义的?

A:无等待,最大并发。

处理同步请求

OKHttp源码分析_第5张图片

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e2vFRqll-1652277849784)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20220511203421678.png)]

OKHttp源码分析_第6张图片

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x67oQ9NZ-1652277849786)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20220511203726924.png)]

然后执行一系列的拦截器

OKHttp源码分析_第7张图片

拦截器(责任链设计模式)

责任链模式:

对象行为型模式,为请求创建了一个接收者对象的链,在处理请求的时候执行过滤(各司其职)。 责任链上的处理者负责处理请求,客户只需要将请求发送到责任链即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

OKHttp源码分析_第8张图片

执行流程

OKHttp源码分析_第9张图片

拦截器责任链

OKHttp源码分析_第10张图片

拦截器概述

  1. (RetryAndFollowUpInterceptor)重试拦截器在交出(交给下一个拦截器)之前,负责判断用户是否取消了请求;在获得了结果之后

    会根据响应码判断是否需要重定向,如果满足条件那么就会重启执行所有拦截器。

  2. (BridgeInterceptor)桥接拦截器在交出之前,负责将HTTP协议必备的请求头加入其中(如:Host)并添加一些默认

    的行为(如:GZIP压缩);在获得了结果后,调用保存cookie接口并解析GZIP数据。

  3. (CacheInterceptor)缓存拦截器顾名思义,交出之前读取并判断是否使用缓存;获得结果后判断是否缓存。

  4. (ConnectInterceptor)连接拦截器在交出之前,负责找到或者新建一个连接,并获得对应的socket流;在获得结果后 不进行额外的处理。

  5. (CallServerInterceptor)请求服务器拦截器进行真正的与服务器的通信,向服务器发送数据,解析读取的响应数据。

OkHttp总结

整个OkHttp功能的实现就在这五个默认的拦截器中,所以先理解拦截器模式的工作机制是先决条件。这五个拦截器分别为: 重试拦截器、桥接拦截器、缓存拦截器、连接拦截器、请求服务拦截器。每一个拦截器负责的工作不一样,就好像工厂流水线,最终经过这五道工序,就完成了最终的产品。

但是与流水线不同的是,OkHttp中的拦截器每次发起请求都会在交给下一个拦截器之前干一些事情,在获得了结果之后又干一些事情。整个过程在请求向是顺序的,而响应向则是逆序。

当用户发起一个请求后,会由任务分发起Dispatcher将请求包装并交给重试拦截器处理。

1、重试拦截器在交出(交给下一个拦截器)之前,负责判断用户是否取消了请求;在获得了结果之后,会根据响应码判断是否需要重定向,如果满足条件那么就会重启执行所有拦截器。

2、桥接拦截器在交出之前,负责将HTTP协议必备的请求头加入其中(如:Host)并添加一些默认的行为(如:GZIP压缩);在获得了结果后,调用保存cookie接口并解析GZIP数据。

3、缓存拦截器顾名思义,交出之前读取并判断是否使用缓存;获得结果后判断是否缓存。

4、连接拦截器在交出之前,负责找到或者新建一个连接,并获得对应的socket流;在获得结果后不进行额外的处理。

5、请求服务器拦截器进行真正的与服务器的通信,向服务器发送数据,解析读取的响应数据。

在经过了这一系列的流程后,就完成了一次HTTP请求!

问题解答

Q:Okhttp请求流程是?

Q:OKHttp分发器是怎么工作的?

Q:OKHttp拦截器是怎么工作的?

Q:应用拦截器和网络拦截器有什么区别?

你可能感兴趣的:(Android三方库源码分析,websocket,网络,http)