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的同步请求的整个流程就已经分析完了。
okhttp同步请求流程和源码分析的更多相关文章
- okhttp异步请求流程和源码分析
在上一次[http://www.cnblogs.com/webor2006/p/8023967.html]中对同步请求进行了详细分析,这次来分析一下异步请求,而关于异步请求和同步请求其使用方式基本上差 ...
- Okhttp同步请求源码分析
进阶android,OKhttp源码分析——同步请求的源码分析 OKhttp是我们经常用到的框架,作为开发者们,我们不单单要学会灵活使用,还要知道他的源码是如何设计的. 今天我们来分析一下OKhttp ...
- Android Debuggerd 简要介绍和源码分析(转载)
转载: http://dylangao.com/2014/05/16/android-debuggerd-%E7%AE%80%E8%A6%81%E4%BB%8B%E7%BB%8D%E5%92%8C%E ...
- Quartz学习--二 Hello Quartz! 和源码分析
Quartz学习--二 Hello Quartz! 和源码分析 三. Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...
- Flask系列10-- Flask请求上下文源码分析
总览 一.基础准备. 1. local类 对于一个类,实例化得到它的对象后,如果开启多个线程对它的属性进行操作,会发现数据时不安全的 import time from threading import ...
- Volley源码解析(三) 有缓存机制的情况走缓存请求的源码分析
Volley源码解析(三) 有缓存机制的情况走缓存请求的源码分析 Volley之所以高效好用,一个在于请求重试策略,一个就在于请求结果缓存. 通过上一篇文章http://www.cnblogs.com ...
- Java并发编程(七)ConcurrentLinkedQueue的实现原理和源码分析
相关文章 Java并发编程(一)线程定义.状态和属性 Java并发编程(二)同步 Java并发编程(三)volatile域 Java并发编程(四)Java内存模型 Java并发编程(五)Concurr ...
- Flask框架 (四)—— 请求上下文源码分析、g对象、第三方插件(flask_session、flask_script、wtforms)、信号
Flask框架 (四)—— 请求上下文源码分析.g对象.第三方插件(flask_session.flask_script.wtforms).信号 目录 请求上下文源码分析.g对象.第三方插件(flas ...
- Kubernetes Job Controller 原理和源码分析(二)
概述程序入口Job controller 的创建Controller 对象NewController()podControlEventHandlerJob AddFunc DeleteFuncJob ...
随机推荐
- 20190926 - macOS 下查看进程路径
首先,从 Activity Monitor 中查看进程 PID,然后使用以下命令查看. ps xuwww -p PID 另一个办法是,使用系统调用 proc_pidpath . #include &l ...
- dfs入门-cogs1640[黑白图像]
题目链接:http://cogs.pro:8081/cogs/problem/problem.php?pid=vxSmxkeqa [题目描述] 输入一个n×n的黑白图像(1表示黑色,0表示白色),任务 ...
- [转帖]nginx1.17.2版本源码安装
nginx1.17.2版本源码安装 原创: 沧海书生 Ansible爱好者 昨天 公众号里面的内容 这里简单测试了下 在x86的虚拟机里面编译安装 nginx 仅make make install n ...
- SQL SERVER DATEPART函数
定义: DATEPART函数返回指定日期的指定部分. 语法: DATEPART(datepart,date) 参数: ①datepart 参数可以是下列的值: datepart 缩写 年(Year) ...
- 小记--------spark资源调度机制源码分析-----Schedule
Master类位置所在:spark-core_2.11-2.1.0.jar的org.apache.spark.deploy.master下的Master类 /** * driver调度机制原理代码分析 ...
- python中的with语句
https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/index.html
- 初遇PHP(一)
因为想给自己弄一个微信公众号,顺便提升一下自己,所以有了以下内容,本次学习的最终目标是能用php制作套微信公众号,然后转成Java.为什么要这么麻烦呢,其一是买的资料书是php的,其二是顺水推舟刚好可 ...
- 手把手教你搭建FastDFS集群(中)
手把手教你搭建FastDFS集群(中) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/u0 ...
- WebFont技术使用之如何在app中使用自定义字体
参考 H5自定义字体解决方法(mark) 移动Web字体的使用 [原]移动web页面使用字体的思考 CSS @font-face规则 引用外部服务器字体
- visual studio2015 搭建pro*c开发编译环境
关于pro*c是什么,这里不做介绍,主要说明如何在vs2015里面开发pro*c程序,并编译exe执行文件 一.vs2015环境配置 1.新建一个空的vc++项目,如下图 2.右击项目属性,添加相关的 ...