周末在家断点调试了一下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方法。