okhttp同步请求流程和源码分析
在上一次【http://www.cnblogs.com/webor2006/p/8022808.html】中已经对okhttp的同步与异步请求的基本使用有了一了初步了解,这次来从源码的角度来分析一下同步请求的流程,先来回顾一下创建同步请求的实现代码:
下面则具体分析一下它的底层细节,按创建步骤来进行:
1、创建一个OkHttpClinet对象:
对于有很多参数需要配置记得第一时间想到使用Builder模式,它也被很多开源框架所大量使用,是一个非常好封装细节的一种手段。
其中比较重要的变量如图中标红的两处,一个是dispatcher,它是一个分发器,由它来决定异步请求是直接处理还是缓存等待,当然对于同步请求而言就简单一些,只是将同步请求加入到队列中进行执行;另一个是connectionPool,它是一个连接池,怎么理解呢?客户端与服务器端的连接将期抽象成一个connection,而每一个连接都会存放到该连接池中由它进行统一的管理,作用之一:当请求的URL是相同的时候则可以利用,作用之二:哪一些网络连接可以保持打开状态、哪一些网络连接是可以复用的这些策略的设置也是通过连接池进行管理的。关于这两个重要的类会在未来进行进一步详解,这里有个大致了解既可。
2、构建了携带请求信息的Request对象:
好,有了OkHttpClient之后,接下来得创建Request对象了,依然采用Builder模式来构建,如下:
首先看一下Builder构造中都做了啥:
接着看一下build()方法的细节:
3、通过OkHttpClient和Request对象,构建出Call对象。
看一下newCall()里面的细节:
所以继续往下:
4、执行Call的execute方法。
看一下execute()方法的实现:
这是个接口空实现,具体还得看一下它的实现类:
此时就得看一下分发器的具体细节了:
而关于Dispatcher到底是个什么东东,下面用图来描述以下,有个大致的认识:
其它Dispatcher就是维护Call请求的一些状态,同时它维护了一个线程池来执行网络请求,而Call请求通过Dispatcher分发器类将其推到执行队列当中进行操作,如果操作完成再执行等待队列的任务,它是OkHttp的核心之一,未来再详续。
然后获取拦截链最终获取Response对象:
好,再回到主流程上来:
其具体细节如下:
其计算也是比较简单:
到此!关于OkHttp的同步请求的整个流程就已经分析完了。