okhttp是目前最流行的网络框架,为什么这样说呢?本文将带领大家逐步解密。
一、使用
想必大家在项目中都是如下使用的,这里以一部请求为例:

这里可以看出发出一条请求,离不开这几个类:
- OkHttpClient
- Request
- Call
- Callback
- 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处理,并将处理结果返回。
本文深入剖析OkHttp网络框架的核心组件,包括OkHttpClient、Dispatcher、Request、Call、RealCall、AsyncCall、Callback和Response,揭示它们之间的交互流程,以及如何通过构造者模式和责任链模式优化网络请求。
613

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



