一、获取OkHttpClient实例
- 通过构造器模式获取实例,不太了解
Builder
模式的请移步
构造器模式,主要关注Dispatcher
分发器与ConnectionPool
连接池。
- 通过调用build()返回实例
二、获取Request实例
- 同样是通过构造器模式获取实例,默认使用
GET
方法请求网络,同时可以看到Headers
也使用构造器模式,源码如下:
三、获取Call对象
- 通过
client.newCall(request)
获取RealCall
对象,RealCall
实现Call
接口
2.接下来进入newRealCall
方法内部,最终返回RealCall
对象
- 在
RealCall
构造方法中分别持有OkHttpClient
实例与Request
实例,同时初始化拦截器RetryAndFollowUpInterceptor
四、异步请求网络
-
通过
enqueue
异步请求网络,实际是调用RealCall
中的enqueue()
方法
-
首先内部使用
synchronized
关键字,首先判断executed
是否为true
,即是否是第一次执行,若为第一次执行则将executed
置为true
,也就是Call
只能执行一次,然后注册监听器,每当调用enqueue
与execute
时会回掉其方法,最后通过Dispatcher
来完成请求 -
Dispatcher
中的enqueue()
是一个同步方法,首先判断运行的异步请求数是否小于最大请求数和运行的主机数是否小于最大主机数,若满足条件则将AsyncCall
加入运行队列中,并通过线程池执行该异步请求,反之,加入到缓存队列中
-
executorService()
创建线程池,可以看出最大线程池数量为Integer.MAX_VALUE
,但是会受到maxRequests=64
的影响,不太清楚线程池请移步 线程池
-
AsyncCall
继承NamedRunnable
,NamedRunnable
实现了Runnable
接口,
-
AsyncCall
实现NamedRunnable
中的抽象方法execute()
,判断拦截器是否取消通过Callback
接口回调相应方法,可以看出回调结果在子线程中
五、同步请求网络
-
首先会通过
getResponseWithInterceptorChain
初始化拦截器链,并获得response实例,同步则是通过runningSyncCalls.add(call);
直接加入到请求队列中
-
finish()
方法,同步代码块中首先从队列中移除call
对象,若不能移除则抛出异常,同步中promoteCalls
为false
,然后计算运行队列中的请求数量runningCallsCount()
-
runningCallsCount()
中计算同步和异步运行就绪的请求队列中的请求数量即call
对象数量