### 前言
上篇文章我们讲了[Okhttp的基本用法](https://www.jianshu.com/p/8e404d9c160f),今天根据上节讲到请求流程来分析源码,那么第一步就是实例化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** 它是静态内部类,这很关键!看源码一定要仔细哦...
这下就全明白了吧?

![](https://img2018.cnblogs.com/blog/1312938/201908/1312938-20190823104515031-785046712.png)

这里的建造者Builder这部分是用了 设计模式中的-建造者模式
如果不知道此模式的伙伴先去把它搞懂,我这里就先简单的说一下:
定义:建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

![](https://img2018.cnblogs.com/blog/1312938/201908/1312938-20190823104515232-1119320481.png)

###### 实用范围
当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
当构造过程必须允许被构造的对象有不同表示时。

可以在网上上找找建造者模式的例子去学习一下,学习之后可以通过建造者模式去模仿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
网络拦截器

等等等等,我就不一一列出了,这些如果开始不知道是干什么的,可以用谷歌翻译去翻译类开头的注释或者成员变量的名字,开始会好理解一下的。我也是这样翻译的。
至于每个成员变量的具体原理我们分析到它时再具体讲解...
大家可以关注我的微信公众号:「秦子帅」一个有质量、有态度的公众号!

![公众号](https://img2018.cnblogs.com/blog/1312938/201908/1312938-20190823104515419-1514084816.jpg)

最新文章

  1. swift3.0的改变
  2. C#解压缩文件
  3. 未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService... 匹配的导出 VS2012报错
  4. C++ 记事本: 从历史说起
  5. CodeForces 173E Camping Groups 离线线段树 树状数组
  6. PHP生成条形码
  7. 第六篇、AVplayer定制视频播放控件
  8. 传智播客学习之HTML基础语法
  9. 前端面试题整理(js)
  10. sql注入绕过union select过滤
  11. Apache OFBiz源码解读之MVC模型
  12. Tomcat的系统安全管理
  13. IT公司PM沟通那儿些事(一)
  14. 酷痞运行于openwrt路由系统
  15. php 压缩文件 zip
  16. Spring boot Value注入 未整理 待完善
  17. VC下CString类型与int 、float等数据类型的相互转换
  18. win7下php7.1运行getenv('REMOTE_ADDR')fastcgi停止运行
  19. 界面编程之QT绘图和绘图设备20180728
  20. [转]java的(PO,VO,TO,BO,DAO,POJO)类名包名解释

热门文章

  1. 精美的在线icon
  2. python 3.5学习笔记(第三章)
  3. js的事件冒泡机制
  4. 博客一键保存本地exe可视化界面文件
  5. [leetcode] 51. N-Queens (递归)
  6. Amdahl定律理解
  7. sql注入篇1
  8. 2019牛客多校第二场H-Second Large Rectangle
  9. 【JDK】JDK源码分析-Map
  10. leetcode并发题目解题报告JAVA版