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