在上一次【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. 构建LNMP平台

    1方案 安装部署Nginx.MariaDB.PHP环境 安装部署Nginx.MariaDB.PHP.PHP-FPM: 启动Nginx.MariaDB.FPM服务: LNMP(Linux.Nginx.M ...

  2. 安装heat

    在控制节点上执行 controller-heat(){mysql -uroot -p${MYSQL_PASSWD} << EOF DROP DATABASE IF EXISTS heat; ...

  3. c++ static_cast和dynamic_cast详解

    注:从图中可以看出,派生类不仅有自己的方法和属性,同时它还包括从父类继承来的方法和属性.当我们从派生类向基类转换时,不管用传统的c语言还是c++转换方式都可以百分百转换成功.但是可怕是向下转换类型,也 ...

  4. 生成器的send方法、递推函数、匿名函数及常用内置函数

    生成器的send方法 在使用yield方法创建生成器时,不仅可以使用next方法进行取值,还可以通过send方法向生成器的内部传值 什么是send方法? send方法相当于高级的next方法,send ...

  5. jstack 命令

    NAME jstack - Prints Java thread stack traces for a Java process, core file, or remote debug server. ...

  6. [转帖]k8s.gcr.io/pause的作用

    k8s.gcr.io/pause的作用 https://blog.51cto.com/liuzhengwei521/2422120 weilovepan520关注0人评论196人阅读2019-07-2 ...

  7. [转帖]彻底理解cookie,session,token

    彻底理解cookie,session,token https://www.cnblogs.com/moyand/p/9047978.html 发展史 1.很久很久以前,Web 基本上就是文档的浏览而已 ...

  8. 【3.3】mysql中的Federated存储引擎,远程表,相当于sql server的linked server

    MySQL中针对不同的功能需求提供了不同的存储引擎.所谓的存储引擎也就是MySQL下特定接口的具体实现. FEDERATED是其中一个专门针对远程数据库的实现.一般情况下在本地数据库中建表会在数据库目 ...

  9. Java list 转树tree的三种写法

  10. table表格整体居中 和 table表格中各行各列内容居中

    1.table表格整个居中<div style="text-align: center;"> <table border="1" style= ...