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

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处理,并将处理结果返回。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值