进阶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() {//异步请求
@Override
public void onFailure(Call call, IOException e) { } @Override
public 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方法。此时,同步方法执行完成。

 

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

Okhttp同步请求源码分析的更多相关文章

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

    转载:http://www.infoq.com/cn/articles/zh-tomcat-http-request-2 很多开源应用服务器都是集成tomcat作为web container的,而且对 ...

  2. # Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析#

    Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析 Volley源码一共40多个类和接口.除去一些工具类的实现,核心代码只有20多个类.所以相对来说分析起来没有那么吃力.但是要想分析透 ...

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

    Tomcat处理HTTP请求源码分析(上) 作者 张华 发布于 2011年12月8日 | 8 讨论 分享到: 微博 微信 Facebook Twitter 有道云笔记 邮件分享 稍后阅读 我的阅读清单 ...

  4. Tomcat处理HTTP请求源码分析(上)(转)

    转载自:http://www.infoq.com/cn/articles/zh-tomcat-http-request-1 很多开源应用服务器都是集成tomcat作为web container的,而且 ...

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

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

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

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

  7. 同步锁源码分析(一)AbstractQueuedSynchronizer原理

    文章转载自 AbstractQueuedSynchronizer的介绍和原理分析 建议去看一下原文的评论,会有不少收获. 简介 AbstractQueuedSynchronizer 提供了一个基于FI ...

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

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

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

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

随机推荐

  1. Maven将远程包拉去到项目指定路径

    <build> <plugins> <plugin> <artifactId>maven-dependency-plugin</artifactI ...

  2. vim编辑器的命令总结

    1. 设置显示行数 :set nu 2. 复制第100至第103行的代码

  3. HTTP/1.0 vs HTTP/1.1 vs HTTP/2

    HTTP 1.0 vs 1.1 Proxy support and the Host field: HTTP 1.1 has a required Host header by spec. HTTP ...

  4. 雷军微博拧螺丝,CFO为粉丝数发愁

    导读 小米集团联合创始人.品牌战略官黎万强4年前写的书<参与感>,估计又要热卖了. 3月24日,小米CFO周受资发微博,“我刚接受了同事的挑战,要在一定时间内在微博上有更多的粉丝”,并向粉 ...

  5. P2613 有理数取余

    原题链接 https://www.luogu.org/problemnew/show/P2613 在这里虽然是讲洛谷的题解,但用到的数论知识,归并到数论里也不为过! 进入正题: 首先看到题面:给出一个 ...

  6. Scrapy 框架 中间件,信号,定制命令

    中间件 下载器中间件 写中间件 from scrapy.http import HtmlResponse from scrapy.http import Request class Md1(objec ...

  7. Python import hook

    转自http://blog.konghy.cn/2016/10/25/python-import-hook/,这里有好多好文章 import hook 通常被译为 探针.我们可以认为每当导入模块的时候 ...

  8. 交互题[CF1103B Game with modulo、CF1019B The hat、CF896B Ithea Plays With Chtholly]

    交互题就是程序与电脑代码的交互. 比如没有主函数的程序,而spj则给你一段主函,就变成了一个整体函数. 还有一种就是程序和spj之间有互动,这个用到fflush(stdout);这个函数就可以实现交互 ...

  9. latex 一些使用

    texlive安装 https://blog.csdn.net/qq_38386316/article/details/80272396 管理员权限打开.bat 语言的安装可以减少 texwork 一 ...

  10. python中os.path.isdir()函数的使用

    在python 中,os.path.isdir(path)函数主要用来判断函数内部的path是否为一个目录 具体关于这个函数的解说参考博客https://blog.csdn.net/xjp_xujip ...