okhttp执行流程及源码解析
在网络框架中我使用的是谷歌官方支持的OKhttp网络请求框架.相对于原生的HttpURLConnect和其他框架.比如说Okgo,Nohhttp,Xutils,Volley等.OkHttp使用方法简单、支持网络请求复用,封装了对网络请求过程进行的处理,效率高.
OkHttp通过构建者模式可以构建拦截器,线程分发器,代理和Socket以及请求体.
通过构建者构建出OkHttpClient对象,再通过newCall方法获得RealCall请求对象.
通过RealCall发起同步或异步请求,而决定是异步还是同步请求的是由线程分发器dispatcher来决定.
线程分发器内部创建了3个队列,异步等待队列/异步执行队列/同步执行队列.
当发起同步请求时会将请求加入到同步队列中依次执行,所以会阻塞UI线程,需要开启子线程执行.
当发起异步请求时会常见一个线程池,并且判断请求队列是否大于最大请求队列64,请求主机数是否大于5,如果大于请求添加到异步等待队列中,否则添加到异步执行队列,并执行任务.
不管是同步或异步都会执行拦截器链,首先经过自定义拦截器,而自定义拦截器一般是Itereptor或Interceptor的实体类,所以会按责任链模式依次向下执行,先经过重定向拦截器然后桥接拦截器(完善请求头后)走到缓存拦截器(使用的是策略模式strategy,通过DiskLruCache算法来执行缓存策略,后边连接拦截器建立和服务器的连接)由于服务拦截器进行网络数据的获取.在服务器拦截器内部它采用了Socket进行的网络通讯并采用OkIo进行处理
获取到数据后,按照拦截器责任链的反向执行,当执行到缓有拦截器后,如果刚请求的数据不为空且之前有该路径的缓存则更新缓存内容,如果之前没有缓存则进行缓存,最后经过重定向拦截器时,会判断是否请求到数据,如果没有则重新请求,如果有数据将数据通过自定义拦截器返回给线程分发器.
因为回调接口是在子线程中执行的,所以更新UI的话我们需要切换回主线程,并且在读取数据时当读取一次后,它的流关闭不允许再读,对返回的数据没有做转换,需要我们手动去做.