###前言
上篇文章我們講了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
網絡攔截器
等等等等,我就不一一列出了,這些如果開始不知道是幹什麼的,可以用谷歌翻譯去翻譯類開頭的註釋或者成員變量的名字,開始會好理解一下的。我也是這樣翻譯的。
至於每個成員變量的具體原理我們分析到它時再具體講解…
大家可以關注我的微信公衆號:「秦子帥」一個有質量、有態度的公衆號!