1.简单使用

同步:@Override public Response execute() throws IOException {

synchronized (this) {

if (executed) throw new IllegalStateException("Already Executed");

executed = true;

}

try {

client.dispatcher().executed(this);

Response result = getResponseWithInterceptorChain(false);

if (result == null) throw new IOException("Canceled");

return result;

} finally {

client.dispatcher().finished(this);

}

}

首先加锁置标志位,接着使用分配器的executed方法将call加入到同步队列中,然后调用getResponseWithInterceptorChain方法(稍后分析)执行http请求,最后调用finishied方法将call从同步队列中删除

异步:1. void enqueue(Callback responseCallback, boolean forWebSocket) {

2. synchronized (this) {

3. if (executed) throw new IllegalStateException("Already Executed");

4. executed = true;

5. }

6. client.dispatcher().enqueue(new AsyncCall(responseCallback, forWebSocket));

7. }

同样先置标志位,然后将封装的一个执行体放到异步执行队列中。这里面引入了一个新的类AsyncCall,这个类继承于NamedRunnable,实现了Runnable接口。NamedRunnable可以给当前的线程设置名字,并且用模板方法将线程的执行体放到了execute方法中

2.总体架构

上图是OkHttp的总体架构,大致可以分为以下几层:Interface——接口层:接受网络访问请求

Protocol——协议层:处理协议逻辑

Connection——连接层:管理网络连接,发送新的请求,接收服务器访问

Cache——缓存层:管理本地缓存

I/O——I/O层:实际数据读写实现

Inteceptor——拦截器层:拦截网络访问,插入拦截逻辑

①Interface——接口层:

接口层接收用户的网络访问请求(同步请求/异步请求),发起实际的网络访问。OkHttpClient是OkHttp框架的客户端,更确切的说是一个用户面板。用户使用OkHttp进行各种设置,发起各种网络请求都是通过OkHttpClient完成的。每个OkHttpClient内部都维护了属于自己的任务队列,连接池,Cache,拦截器等,所以在使用OkHttp作为网络框架时应该全局共享一个OkHttpClient实例。

Call描述一个实际的访问请求,用户的每一个网络请求都是一个Call实例。Call本身只是一个接口,定义了Call的接口方法,实际执行过程中,OkHttp会为每一个请求创建一个RealCall,每一个RealCall内部有一个AsyncCall,AsyncCall继承的NamedRunnable继承自Runnable接口。

所以每一个Call就是一个线程,而执行Call的过程就是执行其execute方法的过程。

Dispatcher是OkHttp的任务队列,其内部维护了一个线程池,当有接收到一个Call时,Dispatcher负责在线程池中找到空闲的线程并执行其execute方法。这部分将会单独拿一篇博客进行介绍,详细内容可参考本系列接下来的文章。

②.Protocol——协议层:处理协议逻辑

Protocol层负责处理协议逻辑,OkHttp支持Http1/Http2/WebSocket协议,并在3.7版本中放弃了对Spdy协议,鼓励开发者使用Http/2。

③.Connection——连接层:管理网络连接,发送新的请求,接收服务器访问

连接层顾名思义就是负责网络连接。在连接层中有一个连接池,统一管理所有的Socket连接,当用户新发起一个网络请求时,OkHttp会首先从连接池中查找是否有符合要求的连接,如果有则直接通过该连接发送网络请求;否则新创建一个网络连接。

RealConnection描述一个物理Socket连接,连接池中维护多个RealConnection实例。由于Http/2支持多路复用,一个RealConnection可以支持多个网络访问请求,所以OkHttp又引入了StreamAllocation来描述一个实际的网络请求开销(从逻辑上一个Stream对应一个Call,但在实际网络请求过程中一个Call常常涉及到多次请求。如重定向,Authenticate等场景。所以准确地说,一个Stream对应一次请求,而一个Call对应一组有逻辑关联的Stream),一个RealConnection对应一个或多个StreamAllocation,所以StreamAllocation可以看做是RealConenction的计数器,当RealConnection的引用计数变为0,且长时间没有被其他请求重新占用就将被释放。

连接层是OkHttp的核心部分,这部分当然也会单独拿一篇博客详细讲解,详细内容可参考本专题相关文章。

④.Cache——缓存层:管理本地缓存

Cache层负责维护请求缓存,当用户的网络请求在本地已有符合要求的缓存时,OkHttp会直接从缓存中返回结果,从而节省网络开销。这部分内容也会单独拿一篇博客进行介绍,详细内容可参考本专题相关文章。

⑤.I/O——I/O层:实际数据读写实现

I/O层负责实际的数据读写。OkHttp的另一大有点就是其高效的I/O操作,这归因于其高效的I/O库okio

这部分内容笔者也打算另开一个专题进行介绍。详细内容可以参考本博客相关内容。

⑥Inteceptor——拦截器层:拦截网络访问,插入拦截逻辑

拦截器层提供了一个类AOP接口,方便用户可以切入到各个层面对网络访问进行拦截并执行相关逻辑。

原文链接:https://www.bbsmax.com/A/kPzOg9lQzx/

okhttp3 请求html页面,OkHttp3源码详解(二) 整体流程相关推荐

  1. Java源码详解二:HashMap源码分析--openjdk java 11源码

    文章目录 HashMap.java介绍 1.HashMap的get和put操作平均时间复杂度和最坏时间复杂度 2.为什么链表长度超过8才转换为红黑树 3.红黑树中的节点如何排序 本系列是Java详解, ...

  2. cosmos源码分析之二整体流程

    cosmos主要的源码其实是在SDK部分,听名字也可以理解出来,直接用这个SDK就可以写出一条不考虑底层的区块链来,但是,做为中继链的一个代表,理想和现实并不是那么完美的结合在一起. 目前区块链的跨链 ...

  3. MySQL源码详解二 初始化performance_schema

    本回将详细分析一个非常重要的函数initialize_performance_schema,从这个函数的名字就可以知道,它是用来初始化performance_schema的,他的目的就是把一些实现类和 ...

  4. 李沐d2l《动手学深度学习》第二版——风格迁移源码详解

    本文是对李沐Dive to DL<动手学深度学习>第二版13.12节风格迁移的源码详解,整体由Jupyter+VSCode完成,几乎所有重要代码均给出了注释,一看就懂.需要的同学可以在文末 ...

  5. OkHttp3源码详解

    前言:为什么有些人宁愿吃生活的苦也不愿吃学习的苦,大概是因为懒惰吧,学习的苦是需要自己主动去吃的,而生活的苦,你躺着不动它就会来找你了. 一.概述 OKHttp是一个非常优秀的网络请求框架,已经被谷歌 ...

  6. Laravel5.5源码详解 -- Laravel-debugbar及使用elementUI-ajax的注意事项

    Laravel5.5源码详解 – Laravel-debugbar 及使用elementUI - ajax的注意事项 关于laravel对中间件的处理,请参中间件考另文, Laravel5.5源码详解 ...

  7. webbench1.5源码详解

    webbench1.5源码详解 前言        Webbench是Linux下的一个网站压力测试工具,它是由Lionbridge公司(http://www.lionbridge.com)开发.   ...

  8. Linux 内核中RAID5源码详解之守护进程raid5d

    Linux 内核中RAID5源码详解之守护进程raid5d 对于一个人,大脑支配着他的一举一动:对于一支部队,指挥中心控制着它的所有活动:同样,对于内核中的RAID5,也需要一个像大脑一样的东西来支配 ...

  9. Vue-Watcher观察者源码详解

    源码调试地址 https://github.com/KingComedy/vue-debugger 什么是Watcher Watcher是Vue中的观察者类,主要任务是:观察Vue组件中的属性,当属性 ...

最新文章

  1. 解决 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 问题
  2. HDU 5693 D Game 区间dp
  3. 2019长安大学ACM校赛网络同步赛 L XOR
  4. bert 多义词_BERT之后,GLUE基准升级为SuperGLUE:难度更大
  5. 教育部:到2021年建设1万个左右国家级一流本科专业点
  6. 软件项目管理第二课—项目投标准备工作及投标函
  7. CSS3特效 - 会呼吸的button按钮
  8. ASP.NET2.0文件上传以及图片处理总结篇 [转]
  9. Something about TFS
  10. autotools归纳
  11. 华铭智能属于芯片概念吗_华铭智能:子公司1个亿参股边缘计算独角兽九次方大数据!...
  12. H5py数据集的制作
  13. c语言:四位数为AABB些型,并且是另一个书的平方,求这昂的四位数
  14. 微信小程序 富文本编辑器 editor
  15. 关于未来趋势的几点预测:
  16. 代码写过300张可视化,为什么建议你用报表工具开发数据大屏?
  17. 合伙企业对外债务如何承担
  18. 套接字Socket编程
  19. GRE词汇整理(magoosh版本)
  20. 2014年IT互联网行业薪酬待遇

热门文章

  1. MySql 缓存查询原理与缓存监控 和 索引监控
  2. PHP中过滤数组中的元素
  3. java orika_常见Bean映射工具分析评测及Orika介绍
  4. js 获取url参数(QueryString)
  5. 图解springmvc 执行流程
  6. 【移植驱动到Linux3.4.2内核之二】LCD,触摸屏,按键,USB等驱动程序的移植心得总结
  7. Android笔记-Activity相关+内存泄漏
  8. 习题2-3 求平方与倒数序列的部分和
  9. P1242 新汉诺塔
  10. 一个ssm综合小案例-商品订单管理-第二天