用了一段时间的OkHttp库,版本3.4.1。 最近总算有时间看看源码了, 主要是根2.4.0版本的区别;
看了篇讲OkHttp的博客http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0326/2643.html , 3.4.1版本有很大变化, 没有HttpClient了。
对于互联网app在使用okhttp时, 一般都是实例化一个Request后交给OkHttpClient。 OkHttpClient通过Dispatcher类(做调度逻辑的, 可以理解为司令的作用)从队列(针对异步方式)里取出请求(Call是一次请求/返回的执行单元),从内存或服务器取数据,并加入到执行队列runningAsyncCalls里, 如果超过限制(做多并发64个请求或相同host的5个请求)则加入到待执行队列readyAsyncCalls; 对于同步方式则执行,并放到runningSyncCalls中管理;
从上图也可以看出OkHttp支持缓存, 即无网络请求下也能拿到接口数据(从上次成功的文件缓存里);OkHttp也使用了线程池, 对使用OkHttp的app来说就不要再创建线程或线程池使用OkHttp了。 多线程并发下载/上传文件的实现方法可以我的上篇博客。
我只画了一部分类图, 要了解OkHttp的调度必须要看Dispather.java, 这个类就是OkHttp的大管家, 它是管着干活的Call类。 Dispatcher.java里有个成员变量executeService, 所有异步请求都是在这个线程池里执行的, 在下面的时序图里Dispatcher之前的时序是同步执行的, Dispatcher后的流程都是在子线程执行的。
ConnectionPool.java也有个线程池变量executor, 从类名看出它是用来复用tcp连接的, 有点像长连接, 在文章头那篇引用博客里讲到了。
在OkHttp框架里用到线程池的就是Dispatcher和ConnectionPool类。
上图是异步请求的时序图, 其中最关键的函数是RealCall类里的