Okhttp同步请求源码分析

简介: 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方法。此时,同步方法执行完成。

相关文章
|
11月前
|
机器学习/深度学习 人工智能 编解码
ByteDance Research登Nature子刊:AI+冷冻电镜,揭示蛋白质动态
在生物医学领域,蛋白质的结构与功能研究至关重要。ByteDance Research团队开发的CryoSTAR软件,结合AI与冷冻电镜技术,通过深度学习模型、结构先验和异质性重构算法,成功解析了蛋白质的动态行为,尤其在处理结构异质性方面表现出色。该软件已在多个蛋白质体系中取得显著成果,如TRPV1通道蛋白的动态变化研究,为理解蛋白质功能及疾病机制提供了新思路。论文链接:https://www.nature.com/articles/s41592-024-02486-1
368 26
|
5月前
|
存储 人工智能 前端开发
RISC-V基金会Datacenter SIG月会圆满举办,探讨RAS、PMU性能分析实践和经验
分享了 X86 和 ARM 架构下 RAS、PMU 性能分析的实践和经验。
|
存储 自然语言处理 供应链
跨境电商团队如何高效管理项目?这5款协作工具值得尝试
跨境电商团队面临的全球化供应链、跨文化沟通、时区差异及语言障碍等挑战,可通过选择合适的协作工具来克服。推荐工具包括板栗看板、Trello、Slack、Asana和Zoom,它们分别在任务管理、即时通讯、项目跟踪和视频会议等方面提供强大支持,帮助团队提升效率、确保任务高效执行和顺畅沟通。
跨境电商团队如何高效管理项目?这5款协作工具值得尝试
大规模、动态语音增强/分离新基准!清华发布移动音源仿真平台SonicSim,含950+小时训练数据
清华大学研究团队推出SonicSim,一款专为语音增强和分离技术设计的移动音源仿真平台。它基于Habitat-sim开发,能生成高度可定制的合成数据,涵盖多个层次的调整选项,有效解决了现有数据集在数量和多样性上的不足。SonicSim不仅提升了模型训练和评估的真实性和全面性,还通过构建SonicSet基准数据集,进一步推动了该领域的研究进展。
240 20
|
机器学习/深度学习 人工智能 自然语言处理
深入理解深度学习中的卷积神经网络(CNN)
深入理解深度学习中的卷积神经网络(CNN)
596 10
|
Java API 数据安全/隐私保护
Spring Boot+Spring Security+JWT 实现 RESTful Api 权限控制
链接网址:https://www.jianshu.com/p/6307c89fe3fa/ 链接网址2:https://blog.csdn.net/linzhiqiang0316/article/details/78358907 jwt介绍:         JWT是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范。
4709 0
|
运维 监控 测试技术
|
机器学习/深度学习 存储 人工智能
更精确地预估到达时间,滴滴新研究提出异质时空图卷积网络
「师傅,还有多长时间能到啊?」在打的赶往目的地时,我们经常会问这样一个问题。但如果我们打的是滴滴,这个问题就不用开口问了。因为,滴滴的研究者正不断挑战更加精确的到达时间预估结果,相关结果被 KDD 2020 接收为Oral论文。
479 0
 更精确地预估到达时间,滴滴新研究提出异质时空图卷积网络
|
监控 供应链 安全
【投毒事件】PyPI 官方仓库遭遇150+恶意包投毒影响
2022年06月23日,OSCS 开源安全社区监测发现 PyPI 官方仓库被攻击者上传了 `agoric-sdk` `datashare` `datadog-agent` 等150+个恶意钓鱼包,OSCS官方提醒广大开发者关注。