栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android,结合源码对OkHttp工作流程的理解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android,结合源码对OkHttp工作流程的理解

帮助我理解的OkHttp博客:
OkHttp3.x解析(二)OkHttp源码以及工作流程解析.

下面这个图搭配源码看真的很容易理解:

OkHttp工作流程大概步骤: 一、通过OkhttpClient创建一个Call,调用newCall(Request request)方法


OkHttpClient.java源码中newCall()方法

从上图可看出创建Call对象后实际调用的是RealCall.newRealCall(**)方法,接下来我们进去看RealCall里面可以干什么

二、同步和异步请求 1、同步:newCall(request).execute(*)

RealCall.java里面定义的同步请求方法

可以从流程图和源码中看到,实际获取response,执行网络请求操作的方法是我用红框框出来的那个getResponseWithInterceptorChain()的方法,大概意思我觉得就是获取拦截器链捕获到的网络请求的内容。后面会说到这个方法。

2、异步:newCall(request).enqueue(*)

RealCall里面定义的异步请求方法

从流程图和源码来看,异步请求方法中调用的是client.dispatcher().enqueue(***)方法,点进这个enqueue方法看是在Dispatcher.java里面
这个方法主要就是将异步任务AsyncCall添加到Dispatcher中维护的队列readyAsyncCalls中等待执行。

从流程图中可以看出,无论是同步请求还是异步请求,最终都是交给RealCall#getResponseWithInterceptorChain()执行网络请求操作。

3、实际执行网络请求操作得到Response的方法

RealCall#getResponseWithInterceptorChain()方法:
附:Interceptor(拦截器)

首先,从上面的源码图可以看出OkHttp创建了一个列表对象之后把 client 中的拦截器、重连拦截器(RetryAndFollowUpInterceptor)、桥拦截器(BridgeInterceptor)、缓存拦截器(CacheInterceptor)、网络连接拦截器(ConnectInterceptor)和服务器请求拦截器(CallServerInterceptor)等依次加入到列表中。

然后,用这个列表创建了一个Interceptor.Chain(拦截器链)。这里使用了责任链设计模式,每当一个拦截器执行完毕之后会调用下一个拦截器或者不调用并返回结果。

最终,拿到的Response响应就是这个链条执行之后返回的结果。当我们自定义一个拦截器的时候,也会被加入到这个拦截器链条里。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/333101.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号