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