OKhtt原理以及异步执行过程

OKhtt原理以及异步执行过程

    先上图,这是Okhttp官网文档的一张OKhttp请求执行流程和经过的拦截器,并且服务器响应的时候经过的拦截器。

        大家看这张图的时候按照流程执行,这是okhttp的请求执行过程,从应用发出request,到应用收到response,期间经历了N个拦截器,可以看出Okhttp的拦截器在整个请求的过程中起到了重大作用,扮演者中要的角色。

    拦截器的作用:

官方文档翻译

Rewriting Requests

Interceptors can add, remove, or replace request headers. They can also transform the body of those requests that have one. For example, you can use an application interceptor to add request body compression if you're connecting to a webserver known to support it.

           拦截器可以对每一个请求头中的信息进行,添加,移除,或者替换。如有请求中有请求体的话还可以对请求体里里面的内容做转换。比如,你可以给你的应用增加一个”内容压缩的拦截器“,对请求体中的内容进行压缩,前提是你请求的服务器能支持你这种压缩后的请求内容,所以要实现类型功能请后端必须沟通好,比如前端采用什么样的压缩算法,后端接收到请求后,采用相同的算法解压。不过一般来说我们都不会采用这种拦截器,因为okhttp 默认就支持GZIP压缩

OKhttp3 核心

 Okhttp3 是一个高性能网络请求框架,支持支持HTTPS/HTTP2/WebSocket ,其核心有一下几点:

    1、采用责任链方式的拦截器,实现分成处理网络请求,让用户对网络请求实现了更好的扩展

    2、GZIP处理降低了下载数据的大小

    3、支持http 缓存

    4、采用线程池(thread pool)和连接池(socket pool)解决多并发问题,同时连接池采支持多路复用(http2才支持多路复用,单路复用指的是,个socket 只有把一个请求发送完成后,才能继续发送第二个请求,多路复用可以让一个socket 同时发送多个请求的数据,内部会自动维护顺序),减少连接创建开销

    5、底层采用 socket 和服务器进行连接。

    6、采用okio 实现高效的io流读写

OkhttpCore(内置5大核心拦截器)

上图拦截器流程示意图中,其中OkhttCore 包含了五大核心拦截器,它们承担了整个网络请求的全部工作。

1.RetryAndFollowUpInterceptor

RetryAndFollowUpInterceptor 的作用,看到该拦截器的名称就知道,它就是一个负责失败重连和重定向的拦截器。它是 Okhttp 内置的第一个拦截器,通过 while (true) 的死循环来进行对异常结果或者响应结果判断是否要进行重新请求。

引用一篇网上的重试机制

2.BridgeInterceptor

BridgeInterceptor 为用户构建的一个 Request 请求转化为能够进行网络访问的请求,同时将网络请求回来的响应 Response 转化为用户可用的 Response。比如,涉及的网络文件的类型和网页的编码,返回的数据的解压处理等等。

3.CacheInterceptor

CacheInterceptor 根据 OkHttpClient 对象的配置以及缓存策略对请求值进行缓存。

可以参考http 的缓存机制:

4.ConnectInterceptor

ConnectInterceptor 在 OKHTTP 底层是通过 SOCKET 的方式于服务端进行连接的,并且在连接建立之后会通过 OKIO 获取通向 server 端的输入流 Source 和输出流 Sink。

5.CallServerInterceptor

CallServerInterceptor 在 ConnectInterceptor 拦截器的功能就是负责与服务器建立 Socket 连接,并且创建了一个 HttpStream 它包括通向服务器的输入流和输出流。而接下来的 CallServerInterceptor 拦截器的功能使用 HttpStream 与服务器进行数据的读写操作的。

自定义拦截器

1.应用拦截器 Application Interceptor

2.网络拦截器 NetWork Interceptor

他们的异同:

相同点

  1)都能对server返回的response进行拦截

      2)这两种拦截器本质上都是基于Interceptor接口,由开发者实现这个接口,然后将自定义的Interceptor类的对象设置到okhttpClient对象中,所以,本质上没什么不同,都是Interceptor的实现类的对象。

  3)两者都会被add到OkHttpClient内的一个ArrayList中。当请求执行的时候,多个拦截器会依次执行(list本身就是有序的)。

不同点

  1)okhttpClient添加两种拦截器的api不同。添加应用拦截器的接口是addInterceptor(),而添加网络拦截器的接口是addNetworkInterceptor().

   2)两者负责的区域不同,从最上方图中可以看出,应用拦截器作用于okhttpCore到Application之间,网络拦截器作用于 network和okhttpCore之间

   3)在某种特殊情况下(比如:访问了一个url,结果这个url发生了重定向),网络拦截器有可能被执行多次,但是 不论任何情况,application只会被执行一次。

    核心源码 


  构建完成Request的后通关newCall发送请求返回一个Call对象后执行异步请求

进到RealCall类中的异步方法  看到最后一行代码,okhttpclient对象调用dispatcher方法返回一个dispatcher对象进行调用dispatcher中的异步方法将call放入异步任务中并将匿名异步任务对象传入道此方法中,  这里的使用的链式编程


进入到disparcher中找到enqueue方法

这里首先是将异步任务添加到了一个准备任务队列中,

if判断中是对正在执行的任务队列或者准备执行的任务队列中找之前执行的异步任务 AsyncCall,首先去准备任务队列中去寻找,找不到了再去正在执行的任务队列中去找,

找到之后去判断是否为空,不为空的话会将找的异步任务传入ReakCall中赋值给本次异步任务(AtomicInteger 一个计数器,线程安全),这个后面会提到。

最后调用的promoteAndExecute()  这个方法大家从字面意思上看大概也知道这就是准备执行了,

Dispatcher 的promoteAndExecute 方法:


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 前言 用OkHttp很久了,也看了很多人写的源码分析,在这里结合自己的感悟,记录一下对OkHttp源码理解的几点心...
    Java小铺阅读 1,490评论 0 13
  • Activity的生命周期 正常的流程: onCreate():被创建的时候被回调, onStart():Acti...
    安梦_4de8阅读 407评论 0 0
  • 关于okhttp是一款优秀的网络请求框架,关于它的源码分析文章有很多,这里分享我在学习过程中读到的感觉比较好的文章...
    蕉下孤客阅读 3,593评论 2 38
  • 用OkHttp很久了,也看了很多人写的源码分析,在这里结合自己的感悟,记录一下对OkHttp源码理解的几点心得。 ...
    蓝灰_q阅读 4,243评论 4 34
  • 第七天 早上起来感觉特别“累”----精力不够,电量75%… 上午:娃带车上…去银行…去供应商…送娃去妈妈上班的学...
    安贞阅读 264评论 0 0