在上一次【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同步请求流程和源码分析的更多相关文章

  1. okhttp异步请求流程和源码分析

    在上一次[http://www.cnblogs.com/webor2006/p/8023967.html]中对同步请求进行了详细分析,这次来分析一下异步请求,而关于异步请求和同步请求其使用方式基本上差 ...

  2. Okhttp同步请求源码分析

    进阶android,OKhttp源码分析——同步请求的源码分析 OKhttp是我们经常用到的框架,作为开发者们,我们不单单要学会灵活使用,还要知道他的源码是如何设计的. 今天我们来分析一下OKhttp ...

  3. 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 ...

  4. Quartz学习--二 Hello Quartz! 和源码分析

    Quartz学习--二  Hello Quartz! 和源码分析 三.  Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...

  5. Flask系列10-- Flask请求上下文源码分析

    总览 一.基础准备. 1. local类 对于一个类,实例化得到它的对象后,如果开启多个线程对它的属性进行操作,会发现数据时不安全的 import time from threading import ...

  6. Volley源码解析(三) 有缓存机制的情况走缓存请求的源码分析

    Volley源码解析(三) 有缓存机制的情况走缓存请求的源码分析 Volley之所以高效好用,一个在于请求重试策略,一个就在于请求结果缓存. 通过上一篇文章http://www.cnblogs.com ...

  7. Java并发编程(七)ConcurrentLinkedQueue的实现原理和源码分析

    相关文章 Java并发编程(一)线程定义.状态和属性 Java并发编程(二)同步 Java并发编程(三)volatile域 Java并发编程(四)Java内存模型 Java并发编程(五)Concurr ...

  8. Flask框架 (四)—— 请求上下文源码分析、g对象、第三方插件(flask_session、flask_script、wtforms)、信号

    Flask框架 (四)—— 请求上下文源码分析.g对象.第三方插件(flask_session.flask_script.wtforms).信号 目录 请求上下文源码分析.g对象.第三方插件(flas ...

  9. Kubernetes Job Controller 原理和源码分析(二)

    概述程序入口Job controller 的创建Controller 对象NewController()podControlEventHandlerJob AddFunc DeleteFuncJob ...

随机推荐

  1. python之selenium三种等待方法

    前提: 我们在做Web自动化时,有的时候要等待元素加载出来,才能操作,不然会报错 1.强制等待 2.隐式等待 3.显示等待 内容: 一,强制等待 这个比较简单,就是利用time模块的sleep的方法来 ...

  2. Chrome F12 谷歌开发者工具解析

    一.工具简单介绍 F12可用于网站界面.性能测试,bug定位等 以 www.baidu.com 为例: Elements:查看页面元素属性(多用于自动化元素定位) Console:记录日志信息(用于定 ...

  3. python3速查参考- python基础 4 -> 元组 + 字典 + 字符串 的学习

    元组 元组:特点就是内容不可变,算只读的列表,可以被查询,不能被修改 a = 2, print(a) print(type(a)) b = ('a','b','c') print(b[1]) 运行结果 ...

  4. 【转】linux下nginx相关操作

    参考文章 <nginx启动,重启,关闭命令> 停止操作 停止操作是通过向nginx进程发送信号(什么是信号请参阅linux文 章)来进行的 步骤1:查询nginx主进程号 ps -ef | ...

  5. 【miscellaneous】多播(组播)原理分析

    为什么要使用多播:        网卡从网络上接收到目标物理地址对应的所有bit位都为1的数据报时,会收到这条消息并将其上传给驱动程序,网卡的这种工作模式称为广播模式,网卡的缺省工作模式包含直接模式和 ...

  6. 【并行计算-CUDA开发】CUDA存储器模型

    CUDA存储器模型 除了执行模型以外,CUDA也规定了存储器模型(如图2所示)和一系列用于主控CPU与GPU间通信的不同地址空间.图中红色的区域表示GPU片内的高速存储器,橙色区域表示DRAM中的的地 ...

  7. [转帖]AARRR已是过去式,而RARRA才是更好的增长黑客模型

    AARRR已是过去式,而RARRA才是更好的增长黑客模型 管理.该方法论已成为了企业家创业的增长利器.但现在看来,AARRR已是过去式. http://www.woshipm.com/operate/ ...

  8. Recordset对象的Open方法

    Recordset对象的Open方法原型: Open([Source],[ActiveConnection],[CursorType],[LockType],[Options]) CursorType ...

  9. 安装oracle数据库11g及问题解决

    安装步骤可借鉴https://www.cnblogs.com/qfb620/p/4577255.html 1.安装后发现用Navicat无法连接数据库显示报错ORA-28547:connection ...

  10. 【详细解析】MySQL索引详解( 索引概念、6大索引类型、key 和 index 的区别、其他索引方式)

    [详细解析]MySQL索引详解( 索引概念.6大索引类型.key 和 index 的区别.其他索引方式) MySQL索引的概念: 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分 ...