Okhttp同步请求源码分析-阿里云开发者社区

开发者社区> 程序员小鱼> 正文

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
数据同步框架MS Sync Framework-不同场景使用例子和简要分析
上一篇http://www.cnblogs.com/2018/archive/2011/02/22/1961654.html 对这个框架一个总体介绍,这篇通过SDK内带的例子和一个综合的例子描述一下这个框架的使用 [例子基于SDK2.
816 0
micro_httpd服务器实现机制分析
micro_httpd是一个轻量级的http服务器 (http://www.acme.com/software/micro_httpd/),micro_httpd从xinetd运行,性能较差,但对于负载较小的网站,micro_httpd是能胜任的,其实现了http服务器的一些基本特征功能: 1.  .
861 0
OKHTTP3源码和设计模式(上篇)
本文来探究一下 OkHttp3 的源码和其中的设计思想。 关于 OkHttp3 的源码分析的文章挺多,不过大多还是在为了源码而源码。
1653 0
Tornado 源码分析(一)
Tornao 源码分析一,回调管理
6348 0
openstack 源码分析
  Nova对于底层Hypervisor(如KVM/QEMU等)的调用与管理主要通过LibvirtDriver类,nova/virt/libvirt/driver.py   Libvirt对Hypervisor的连接有两种方式:一种是只读式,用于管理;另一种是认证式,用于操作;   创建实例过程:/nova/api/ec2/cloud.
975 0
Ingress-nginx 源码分析
对于像我这样的 k8s 萌新来说,ingress-nginx 项目有着很重要的意义。从学习 k8s 的角度来讲,它功能简练,代码量相对较少,很适合我们通过它来侧面理解 k8s 中的一些概念。
2414 0
Wireshark抓包分析/TCP/Http/Https及代理IP的识别
前言   坦白讲,没想好怎样的开头。辗转三年过去了。一切已经变化了许多,一切似乎从没有改变。   前段时间调研了一次代理相关的知识,简单整理一下分享之。如有错误,欢迎指正。 涉及 Proxy IP应用 原理/层级wireshark抓包分析 HTTP head: X-Forwarded-For/ Proxy-Connection/伪造  X-Forwarded-For/ 以及常见的识别手段等几个方面。
1661 0
+关注
程序员小鱼
6年Android开发大神,决心做更有成就感的事情,于是有这个公众号【终端研发部】,谈的是产品,谈的是技术,更谈的是人生,一条执着于技术+职场经验之路,从人工智能Python, Android、NDK,等FFmpeg音视频解码 ,致力于做东半球最优秀的程序员!
28
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载