专栏首页秦子帅Okhttp3源码解析(1)-OkHttpClient分析
原创

Okhttp3源码解析(1)-OkHttpClient分析

前言

上篇文章我们讲了Okhttp的基本用法,今天根据上节讲到请求流程来分析源码,那么第一步就是实例化OkHttpClient对象,所以我们今天主要分析下OkHttpClient源码!

初始化-构造方式

创建 OkHttpClient实例的两种方式

1.  OkHttpClient okHttpClient = new OkHttpClient();
2.  OkHttpClient okHttpClient = new OkHttpClient.Builder().build(); 

我们先研究第一种构造方式,也是默认的方式,我们点击OkHttpClient方法进去:

  public OkHttpClient() {
    this(new Builder());
  }

发现是一个类构造方法,this其实就是指的是OkHttpClient,也就是如下方法:

  OkHttpClient(Builder builder) {
    this.dispatcher = builder.dispatcher;
    this.proxy = builder.proxy;
    this.protocols = builder.protocols;
    this.connectionSpecs = builder.connectionSpecs;
    this.interceptors = Util.immutableList(builder.interceptors);
    this.networkInterceptors = Util.immutableList(builder.networkInterceptors);
    this.eventListenerFactory = builder.eventListenerFactory;
    this.proxySelector = builder.proxySelector;
    this.cookieJar = builder.cookieJar;
    this.cache = builder.cache;
    this.internalCache = builder.internalCache;
    this.socketFactory = builder.socketFactory;
   ....部分代码省略
  }

然后顺理成章的看一下new Builder() 方法

    public Builder() {
      dispatcher = new Dispatcher();
      protocols = DEFAULT_PROTOCOLS;
      connectionSpecs = DEFAULT_CONNECTION_SPECS;
      eventListenerFactory = EventListener.factory(EventListener.NONE);
      proxySelector = ProxySelector.getDefault();
      cookieJar = CookieJar.NO_COOKIES;
      socketFactory = SocketFactory.getDefault();
      hostnameVerifier = OkHostnameVerifier.INSTANCE;
      certificatePinner = CertificatePinner.DEFAULT;
      proxyAuthenticator = Authenticator.NONE;
      authenticator = Authenticator.NONE;
      connectionPool = new ConnectionPool();
      dns = Dns.SYSTEM;
      followSslRedirects = true;
      followRedirects = true;
      retryOnConnectionFailure = true;
      connectTimeout = 10_000;
      readTimeout = 10_000;
      writeTimeout = 10_000;
      pingInterval = 0;
    }

不出意料, 都是做了一些初始化配置...这块的细节先不说,我们继续看另一个种构造方式

2.  OkHttpClient okHttpClient = new OkHttpClient.Builder().build(); 

我们点击build()方法:

    public OkHttpClient build() {
      return new OkHttpClient(this);
    }

这里需要我们注意的是Builder 它是静态内部类,这很关键!看源码一定要仔细哦...

这下就全明白了吧?

这里的建造者Builder这部分是用了 设计模式中的-建造者模式

如果不知道此模式的伙伴先去把它搞懂,我这里就先简单的说一下:

定义:建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

实用范围

当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

当构造过程必须允许被构造的对象有不同表示时。

可以在网上上找找建造者模式的例子去学习一下,学习之后可以通过建造者模式去模仿okhttp的请求(Request) 就理解的充分了!

OkHttpClient初始化都配置了什么????

上面讲到了OkHttpClient的两种构造方式, 通过查看源码,两种方式的配置是相同的,下面具体看一下到底配置了什么:、

    public Builder() {
      dispatcher = new Dispatcher();
      protocols = DEFAULT_PROTOCOLS;
      connectionSpecs = DEFAULT_CONNECTION_SPECS;
      eventListenerFactory = EventListener.factory(EventListener.NONE);
      proxySelector = ProxySelector.getDefault();
      cookieJar = CookieJar.NO_COOKIES;
      socketFactory = SocketFactory.getDefault();
      hostnameVerifier = OkHostnameVerifier.INSTANCE;
      certificatePinner = CertificatePinner.DEFAULT;
      proxyAuthenticator = Authenticator.NONE;
      authenticator = Authenticator.NONE;
      connectionPool = new ConnectionPool();
      dns = Dns.SYSTEM;
      followSslRedirects = true;
      followRedirects = true;
      retryOnConnectionFailure = true;
      connectTimeout = 10_000;
      readTimeout = 10_000;
      writeTimeout = 10_000;
      pingInterval = 0;
    }
  • Dispatcher 调度器,执行异步请求时的策略
  • protocols OKHTTP实现的协议LIST
  • connectionSpecs TLS版本与连接协议
  • eventListenerFactory 监听器
  • proxySelector 代理选择器
  • CookieJar cookie
  • socketFactory socket 工厂
  • hostnameVerifier 主机name验证
  • proxyAuthenticator 代理验证
  • authenticator 验证
  • connectionPool 连接池
  • dns dns域名
  • cache 缓存
  • interceptors 拦截器
  • networkInterceptors 网络拦截器

等等等等,我就不一一列出了,这些如果开始不知道是干什么的,可以用谷歌翻译去翻译类开头的注释或者成员变量的名字,开始会好理解一下的。我也是这样翻译的。

至于每个成员变量的具体原理我们分析到它时再具体讲解...

大家可以关注我的微信公众号:「秦子帅」一个有质量、有态度的公众号!

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Okhttp3源码解析(3)-Call分析(整体流程)

    想起来了吧?无论是get还是post请求 都要生成call对象,在上面我们发现call实例需要一个okHttpClient与request实例 ,我们先点进C...

    秦子帅
  • Flutter安装入门教程

    Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。 Flutter可以与现有的代码一起工作。在全世界,Flutte...

    秦子帅
  • Okhttp3源码解析(2)-Request分析

    当我们构建完OkHttpClient对象,需要构造Request对象,构造方式如下:

    秦子帅
  • teg saltstack部署

    yum install https://repo.saltstack.com/yum/redhat/salt-repo-2017.7-1.el7.noarch....

    葫芦
  • 【12】2小时还你一个集打赏、评论、RSS功能于一身的个人博客

    几个月前,写过几篇关于Hexo博客搭建的教程,最近几天,发现有很多读者私信我一些Hexo搭建过程中遇到的问题,重新燃起了我对Hexo博客的兴趣,于是花了一两天的...

    代码咖啡
  • (四十七)c#Winform自定义控件-树表格(treeGrid)

    GitHub:https://github.com/kwwwvagaa/NetWinformControl

    冰封一夏
  • 算法 | 朴素贝叶斯

    朴素贝叶斯是实用性很高的一种学习器,主要基于贝叶斯定理和条件独立性假设求出后验概率,将后验概率最大的类别作为预测的结果.

    小石头
  • 今天开始,我来讲讲Git的故事!

    相信大家都听说过Git,因为每一个写程序的人都离不开它。但是真正能够掌握它还是需要下一点功夫的。今天开始,Git系列的文章开始连载,希望大家能够持续的关注。

    JAVAandPython君
  • Python Web - Flask笔记3

    if条件判断语句必须放在{% if statement %}中间,并且还必须有结束的标签{% endif %}。和python中的类似,可以使用>,<,<=,>...

    YingJoy_
  • 如何实现多站点运维监控?

    在小型公司里如果产品线单一的话,比如就一个app, 一般1~2个运维就够用了,如果产品过于庞大,就需要多个运维人员,但对于多产品线的公司来说,运维人员就要必须...

    小小科

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动