周末在家断点调试了一下okhttp的执行流程,翻看了一下okhttp的源码,对okhttp有了一个大致的了解,在这记录一下。okhttp的精髓是Dispatcher
和Interceptor
,这里主要分析这两个。
Dispatcher
Dispatcher
是在OkHttpClient.Builder
中实例化的,主要维护了runningSyncCalls
,runningAsyncCalls
,readyAsyncCalls
三个队列。
同步的请求在执行execute
方法时会将RealCall
对象添加到runningSyncCalls
队列中去,然后调用getResponseWithInterceptorChain
去获取Response
,不管成功失败,在finally
块中都会执行runningSyncCalls.remove(realcall)
将RealCall
对象移除出队列。类似于一个生产者消费者系统。
异步的请求会将请求包装成一个AsyncCall
,实际上就是一个Runnable,然后看runningAsyncCalls
队列的长度是否小于maxRequests
也即64并且同一个host的请求是否小于maxRequestsPerHost
,如果满足则添加到runningAsyncCalls
队列中去,并且调用线程池执行,否则添加到readyAsyncCalls
队列中去。在AsyncCall
这个Runnable
的run
方法中又会去调用getResponseWithInterceptorChain
去获取Response
,值得注意的是在finally
块中,将AsyncCall
移除出队列的时候会调用promoteCalls
方法。