架构师学习--okhttp3原理解析

本文深入剖析OkHttp网络框架的核心组件,包括OkHttpClient、Dispatcher、Request、Call、RealCall、AsyncCall、Callback和Response,揭示它们之间的交互流程,以及如何通过构造者模式和责任链模式优化网络请求。

okhttp是目前最流行的网络框架,为什么这样说呢?本文将带领大家逐步解密。

一、使用

想必大家在项目中都是如下使用的,这里以一部请求为例:
在这里插入图片描述
这里可以看出发出一条请求,离不开这几个类:

  1. OkHttpClient
  2. Request
  3. Call
  4. Callback
  5. Response

下面就对这四个类逐个击破。

二、常用类介绍

1、OkHttpClient

这个类使用构造者模式,通过这个类我们能够设置分发器Dispatcher、自定义拦截器、连接超时时间等
在这里插入图片描述
这里出现分发器,下面看一下它

2、Dispatcher

在这里插入图片描述
maxRequests:表示当前最大的请求数量不能超过64(为手机性能考虑)
maxRequestsPerHost:表示同时访问同一台服务器的个数不能超过5(为服务器压力考虑)
executorService:这里使用了缓存线程池,所有的异步任务都在线程池中执行
readyAsyncCalls:等待队列(如果当前条件不满足maxRequests,maxRequestsPerHost就会把任务加入到等待队列中)
runningAsyncCalls:运行异步任务队列
runningSyncCalls:运行同步任务队列

这个类还提供了几个比较重要的方法

(1)executorService()方法
在这里插入图片描述
这个方法会创建一个缓存线程池,并且将线程命名为"OkHttp Dispatcher",设置为非守护线程。

(2)enqueue()方法
在这里插入图片描述
这个方法会将任务添加到执行队列runningAsyncCalls和等待队列readyAsyncCalls中。

(3)finished()方法
在这里插入图片描述
这个方法处理完成以后会将执行完的任务从执行队列runningAsyncCalls移除,并把等待队列readyAsyncCalls的任务添加到执行队列中,然后继续请求。

(4)executed()方法
在这里插入图片描述
将任务添加到可执行同步队列中。

3、Request

在这里插入图片描述
这个类也是使用建造者模式构建的,重点看一下几个属性信息:

url:请求的地址,也就是上面的 http:www.baidu.com
method:请求的方式 get、post等
headers:请求头(包含请求行、请求属性集)
body:针对post请求(包含请求体的长度、请求的类型[form表单类型等])

这个类也提供了常见的addHeader方法:
在这里插入图片描述

4、Call

在这里插入图片描述
它是一个接口,对外提供了方法。直接实现类是RealCall。

5、RealCall

在这里插入图片描述
其中有一个属性executed,它存在的意义就是告诉我们,不能重复执行call.execute()方法。

这个是实现了提供了几个比较重要的方法:

(1)newRealCall()方法
在这里插入图片描述
将外部实例化的OkHttpClient传进来,这样RealCall类就持有了这个对象,并且调用构造方法返回RealCall对象。

(2)execute()方法
在这里插入图片描述
就如前面所说,这个方法不能调用两次。条件满足后,会调用Dispatcher的enqueue()方法,将任务添加到运行队列中,开始消费。这里会实例化一个AsyncCall,它是什么?由于提交给线程池执行的一定是Runnable类型的,所以这个AsyncCall也是实现了Runnable接口。

6、AsyncCall

它是RealCall的内部类
在这里插入图片描述
这个responseCallback就是结果的回调。
主要看一下最重要的方法
在这里插入图片描述
首先通过责任链模式拿到请求结果。这里的责任链包括:重试机制和重定向的拦截器(RetryAndFollowUpInterceptor),请求头拦截器(BridgeInterceptor),与服务器真实连接的拦截器(ConnectInterceptor)等。处理结果拿到后,将它回调出去。

7、Callback

在这里插入图片描述
结果的回调接口,提供成功和失败的两个回调方法。

8、Response

在这里插入图片描述
这个类就是将网络请求的结果进行了封装。

三、流程

了解了okHttp的主要类,下面对类之间的调用流程进行分析。

1、初始化okHttp

在这里插入图片描述

2、初始化Request

在这里插入图片描述

3、初始化Call

在这里插入图片描述
返回RealCall对象

4、call.enqueue

在这里插入图片描述
流程图已经比较清楚了。最终会交由AsyncCall处理,并将处理结果返回。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值