在上一次【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. 第四章 信息收集之nmap

    @nmap扫描工具 nmap是使用最广泛的扫描工具,主要的使用范围有,嗅探,扫描,ping. 局域网扫描 nmap扫描的基本命令: 首先在桌面右键选择open in terminal进入命令窗口,输入 ...

  2. 云计算openstack核心组件--glance-镜像服务(6)

    glance做什么 OpenStack 由 Glance 提供 Image 服务 获取镜像位置 https://docs.openstack.org/image-guide/obtain-images ...

  3. 【JAVA开发】Eclipse几个版本说明

    查看Eclipse的版本号: 1. 找到eclipse安装目录 2. 进入readme文件夹,打开readme_eclipse.html 3. readme_eclipse.html呈现的第二行即数字 ...

  4. Springboot Actuator之一:执行器Actuator入门介绍

    介绍 Spring Boot有四大神器,分别是auto-configuration.starters.cli.actuator,本文主要讲actuator.actuator是spring boot提供 ...

  5. kettle转换设置变量,校验输出新变量

    背景:有很多小的转换需要串联起来,如果前一个执行成功,后面继续接着执行,如果执行等待中,就让程序等一会再次获取数据分析,如果失败就中止,成功就进行下一个转换,以此类推.... 需求:通过job把参数传 ...

  6. java持续添加内容至本地文件

    package com.lcc.commons; import com.lcc.commons.dto.FileLogDTO; import java.io.*; import java.util.A ...

  7. 烯烃(olefin) 题解

    题面 对于每个点,我们可以用一次dfs求出这个点到以这个点为字树的最远距离和次远距离: 然后用换根法再来一遍dfs求出这个点到除这个点子树之外的最远距离: 显然的,每次的询问我们可以用向上的最大值加向 ...

  8. PAT A1012 Best Rank(25)

    题目描述 To evaluate the performance of our first year CS majored students, we consider their grades of ...

  9. SDL2 程序 编译 错误 及 解决方案

    main函数应写为int main( int argc, char* args[] )而不是int main()形式 链接库时应注意顺序 mingw32;SDL2main;SDL2;          ...

  10. 【动态规划】subsequence 1

    题目链接:https://ac.nowcoder.com/acm/contest/885/G 题意: 两个串,s  t,求s的所有子串中大于 t  的数目 题解: dp[i][j] 表示 s的前i个, ...