进阶android,OKhttp源码分析——同步请求的源码分析

OKhttp是我们经常用到的框架,作为开发者们,我们不单单要学会灵活使用,还要知道他的源码是如何设计的。

今天我们来分析一下OKhttp 同步请求的执行流程和源码分析

so,老样子,我们先来一张图

从上图可以看出,不管是同步请求还是异步请求,我们都需要创建一个OKhttpClient对象,用到的是build构造者模式,创建Request对象,然后再OKhttpClient的newCall方法和Request来封装我们的call对象。创建我们的实际请求的call对象,从上图可以看到,对于同步请求,我们调用的是excute方法,异步请求调用的是equeue方法。

我们看一下做简单使用

OkHttpClient okHttpClient = new  OkHttpClient.Builder().readTimeout(10, TimeUnit.SECONDS).build();Request request = new Request.Builder().url("https://blog.csdn.net/androidstarjack").build();Call call = okHttpClient.newCall(request);try {call.execute();//同步请求call.enqueue(new Callback() {//异步请求@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {}});} catch (IOException e) {e.printStackTrace();}复制代码

我们先看一下okhttp的build

首先我们通过源码可以看出,okhttp的创建时通过build方法来创建的,其中初始化了一些事情,比如创建一个dispatcher拦截器,和一个连接池,连接池只要是链接状态的保存以及复用。build是要是创建 okhttp是所需要的参数。

在创建Request创建的时候也是用构造者模式进行创建的,源码如下:

  Builder(Request request) {this.url = request.url;this.method = request.method;this.body = request.body;this.tag = request.tag;this.headers = request.headers.newBuilder();}
复制代码

request的build构造里面初始化了一些请求的URL,请求方法哈请求头等请求报文的一些信息。

Call对象 是通过他的父亲RealCall来完成的。

Call对象持有了Okhttp 和Request两个对象,同时呢还创建了一个缓存拦截器RetryAndFollowUpInterceptor,用于所需要的重定向操作。

通过调用okhttpClient的newCAll来完成CALL的新建,进行相应的操作

紧接着调用execute方法来完成同步请求!

@Override public Response execute() throws IOException {synchronized (this) {if (executed) throw new IllegalStateException("Already Executed");executed = true;}captureCallStackTrace();eventListener.callStart(this);try {client.dispatcher().executed(this);Response result = getResponseWithInterceptorChain();if (result == null) throw new IOException("Canceled");return result;} catch (IOException e) {eventListener.callFailed(this, e);throw e;} finally {client.dispatcher().finished(this);}}复制代码

//布尔值executed表示一个okhttp请求只能运行执行一次,然后开启捕捉一些错误堆栈信息,点用一个eventListener监听方法, 接卸来是调用分发器的executed方法。这才是重中之重。

...client.dispatcher().executed(this);
...复制代码

client.dispatcher返回一个分发器。然后通过分发器来执行操作:

在同步请求中,调用executed方法,很简单酒吧这个Call对象添加到队列当中。

Dispatcher的作用主要是维持call请求发给他 的状态,同时维护了一个线程池,开启了网络请求。

从源码中我们可以看到Dispatcher

这几个请求队列代表着不同状态下的请求情况。

紧接着通过拦截器链依次调用执行操作。 最后还调用了Finish方法

注意第三个参数,为false,这个方法的主要作用就是移除当前的请求,如果不能移除的话,返回异常,我们可以注意到,同步请求不需要调用promoteCalls,只有在异步请求的时候才会调用到,这个方法以后我们在讲。

最后判断,正在将要执行的请求队列集合为0并且闲调用的回调不为null时,调用其run方法。此时,同步方法执行完成。

2018年技术文章汇总

NDK项目实战—高仿360手机助手之卸载监听

(Android)面试题级答案(精选版)

如果对技术开发比较感兴趣,欢迎关注公众号:终端研发部。一起交流技术,进阶!

Okhttp同步请求源码分析相关推荐

  1. Tomcat 处理 HTTP 请求源码分析(下)【转】

    原文地址:https://www.infoq.cn/article/zh-tomcat-http-request-2 很多开源应用服务器都是集成 tomcat 作为 web container 的,而 ...

  2. 安卓总结 之 OkHttp使用及源码分析(三)

    本章主要介绍Okhttp的使用和和源码分析 准备工作 常见用法 OkHttp更好的封装 OkHttp的源码分析 一. 准备工作 在gradle中添加依赖 implementation 'com.squ ...

  3. Tomcat 处理 HTTP 请求源码分析(上)【转】

    原文地址:https://www.infoq.cn/article/zh-tomcat-http-request-1 很多开源应用服务器都是集成 tomcat 作为 web container 的,而 ...

  4. 知识小罐头07(tomcat8请求源码分析 下)

    感觉最近想偷懒了,哎,强迫自己也要写点东西,偷懒可是会上瘾的,嘿嘿!一有写博客的想法要赶紧行动起来,养成良好的习惯. ok,继续上一篇所说的一些东西,上一篇说到Connector包装了那两个对象,最后 ...

  5. Android 4.4以上使用HttpURLConnection底层使用OkHttp实现的源码分析

    研究了一下HttpURLConnection的源码: 在使用的时候都是通过URL.openConnection()来获取HttpURLConnection对象,然后调用其connect方法进行链接,所 ...

  6. 知识小罐头06(tomcat8请求源码分析 中)

    更正上一篇一个小错误,Connector中首先是将socket请求过来的信息封装成一个普通的Request对象(上一篇我写成HttpRequest对象,失误失误,根本就木有HttpRequest这样的 ...

  7. 知识小罐头05(tomcat8请求源码分析 上)

    这一篇我们不看源码,就大概理一下Tomcat内部组成部分!前面花费了两篇博客的篇幅来说说了一般的maven web项目并部署到tomcat运行,其实都是为这篇做铺垫的! 其实我下载了tomcat7,t ...

  8. ue4中在物体上加ui_UE4 物体位置同步相关源码分析浅谈

    前言 多图, 不想在源代码写注释, 不想贴代码块, 看的不清楚 版本4.21混4.22, 区别不大 文章属于旧有文章搬运, 之前在csdn上面 2019.10.27修改一版 物体位置信息同步, 或者说 ...

  9. 【OkHttp】OkHttp 源码分析 ( 同步 / 异步 Request 请求执行原理分析 )

    OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...

最新文章

  1. 如何在主机win10和虚拟机(virtualbox)中的Ubuntu进行文件传输即共享文件夹的建立
  2. 请输入课程编号C语言,C语言 学生选课系统 程序
  3. python的闭包及装饰器
  4. 【iMX6ULL核心板】一款高性能低功耗的IMX6ULL核心板 | 触觉智能NXP IMX6ULL核心板
  5. HSDIS工具在macbook M1电脑的安装
  6. CentOS修改主机名(hostname)
  7. KVOController代码分析和踩坑
  8. NOIP提高组复赛 知识点整理
  9. 如何使用RMAN duplicate搭建12C的Data Guard环境?
  10. [面试] 算法(二)—— 第一个出现一次的字符(第一个出现 k 次、出现最多次)
  11. [转载] 使用openpyxl模块向Excel中插入图片
  12. linux系统的初化始配置(临时生效和永久生效)
  13. 枯燥的计算机组成原理课.....!!! 看来只能自己看书消化了...!!!
  14. android windows 共享文件,Win10下与android文件共享
  15. 非线性方程求解 matlab,MATLAB应用 求解非线性方程
  16. Golang——从入门到放弃
  17. mongodb获取具体某一天的查询语句
  18. C++-STL(1)-Vector-随机数(randon、default_random_engine)
  19. MaxEnt软件的安装
  20. 学习Protobuf,ZigZag是啥你真的知道么?

热门文章

  1. linux 命令博客,Linux命令(一)
  2. A comparative study of various methods of bearing faults diagnosis using the CWRU data.-学习笔记
  3. react报Maximum update depth exceeded
  4. Python(8):模块内置变量
  5. OpenStack、KVM、Docker——Docker之后还需要OpenStack吗?
  6. Fedora 31 已经为 Python 3.8 做好了准备
  7. 轻松监听Azure service health 状态
  8. ubuntu 系统分配固定 ip--
  9. ElasticSearch学习29_基于Elasticsearch实现搜索推荐
  10. 关闭linux防火墙及selinux的关闭