上篇文章咱们讲了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() 方法cookie
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 它是静态内部类,这很关键!看源码必定要仔细哦... 这下就全明白了吧?socket
这里的建造者Builder这部分是用了 设计模式中的-建造者模式
若是不知道此模式的伙伴先去把它搞懂,我这里就先简单的说一下: 定义:建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得一样的构建过程能够建立不一样的表示。学习
当建立复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。 当构造过程必须容许被构造的对象有不一样表示时。ui
能够在网上上找找建造者模式的例子去学习一下,学习以后能够经过建造者模式去模仿okhttp的请求(Request) 就理解的充分了!
上面讲到了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 网络拦截器
等等等等,我就不一一列出了,这些若是开始不知道是干什么的,能够用谷歌翻译去翻译类开头的注释或者成员变量的名字,开始会好理解一下的。我也是这样翻译的。 至于每一个成员变量的具体原理咱们分析到它时再具体讲解... 你们能够关注个人微信公众号:「秦子帅」一个有质量、有态度的公众号!