一、获取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对象数量