Okhttp同步请求源码分析
进阶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方法。此时,同步方法执行完成。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
IOS下P2P播放器开发如何实现?
目前可以利用p2p技术,实现支持磁力链接、普通链接甚至是种子链接播放的软件,基本上还是集中在PC端。比如市场占有比较多的西瓜影音、吉吉影音、先锋影音,还有迅雷等。但是在手机端除了迅雷似乎没太有比较出名的P2P播放器。那么P2P技术在移动端的应用,从技术上来说是否可实现?包括安卓和iOS系统 虽然P2P技术是在pc时代诞生和发扬光大的,但是那是很多年前,当时的电脑端的硬件环境比现在的很多手机要差的多。举个例子,10几年前赛扬1G、128M内存的电脑,运用P2P技术下载速度是完全可以的。而现在的移动端手机,动不动已经64G、128G存储了,而128G可以存几部电视剧了。所以从技术角度来说,在移动iOS端做P2P播放器是完全没问题的。 # 大概的原理是这样实现的:**1)播放器在播放磁力链、或者torrrent文件时,调用自身的P2P引擎,p2p引擎里面通过torrent或者磁力链信息,去通过tracker、DHT寻找周围的peer邻居,然后获取数据。2)p2p获取到的数据,通过播放器可以支持的协议,返回给播放器,播放器来看,这就是一个标准的mp4/flv等视频文件,所以他可以正常播放3)播...
- 下一篇
Mac下Android Studio 3.x的NDK开发环境搭建
目录 前言 CMake 用CMake向已有AS项目添加C/C++代码 ndk-build 最后 前言 mac上安装软件真的很简单, 一路下一步就可以安装好android studio. 这里有一篇旧文-Mac下安装配置Android Studio 2.x和3.x并配置使用adb可供参考.而写这篇的目的, 主要是我发现之前的ndk开发方式已经过时了, 需要更新一下新的流程. CMake CMake的方式是官方默认的ndk构建方式, 先从默认栗子开始看吧. 新建一个项目, 勾选C++ support: 你会发现初始的Activity就只能是基础或者空的类型了, 其他的都没了. 这里默认C++标准即可: C++ Standard: 选择哪一种C++标准, 默认选择Toolchain Default选项, 其会使用默认的CMake配置 Exceptions Support: 是否启用对C++异常处理的支持, 如果选中, AS会将-fexceptions标志添加到模块级build.grade文件的cppFlags中 Runtime Type Information Support: 是否支持RT...
相关文章
文章评论
共有0条评论来说两句吧...