Solarex's Blog

我只想过,平平淡淡的生活,欲望啊,请放过脆弱的我

Okhttp3源码分析

| Comments

周末在家断点调试了一下okhttp的执行流程,翻看了一下okhttp的源码,对okhttp有了一个大致的了解,在这记录一下。okhttp的精髓是DispatcherInterceptor,这里主要分析这两个。

Dispatcher

Dispatcher是在OkHttpClient.Builder中实例化的,主要维护了runningSyncCallsrunningAsyncCalls,readyAsyncCalls三个队列。

同步的请求在执行execute方法时会将RealCall对象添加到runningSyncCalls队列中去,然后调用getResponseWithInterceptorChain去获取Response,不管成功失败,在finally块中都会执行runningSyncCalls.remove(realcall)RealCall对象移除出队列。类似于一个生产者消费者系统。

异步的请求会将请求包装成一个AsyncCall,实际上就是一个Runnable,然后看runningAsyncCalls队列的长度是否小于maxRequests也即64并且同一个host的请求是否小于maxRequestsPerHost,如果满足则添加到runningAsyncCalls队列中去,并且调用线程池执行,否则添加到readyAsyncCalls队列中去。在AsyncCall这个Runnablerun方法中又会去调用getResponseWithInterceptorChain去获取Response,值得注意的是在finally块中,将AsyncCall移除出队列的时候会调用promoteCalls方法。