上篇文章咱們講了Okhttp的基本用法,今天根據上節講到請求流程來分析源碼,那麼第一步就是實例化OkHttpClient對象,因此咱們今天主要分析下OkHttpClient源碼!算法
建立 OkHttpClient實例的兩種方式設計模式
1. OkHttpClient okHttpClient = new OkHttpClient();
複製代碼
2. OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
複製代碼
咱們先研究第一種構造方式,也是默認的方式,咱們點擊OkHttpClient方法進去:緩存
public OkHttpClient() {
this(new Builder());
}
複製代碼
發現是一個類構造方法,this其實就是指的是OkHttpClient,也就是以下方法:bash
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;
}
複製代碼
不出意料, 都是作了一些初始化配置...這塊的細節先不說,咱們繼續看另外一個種構造方式cookie
2. OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
複製代碼
咱們點擊build()方法:網絡
public OkHttpClient build() {
return new OkHttpClient(this);
}
複製代碼
這裏須要咱們注意的是Builder 它是靜態內部類,這很關鍵!看源碼必定要仔細哦... 這下就全明白了吧?異步
這裏的建造者Builder這部分是用了 設計模式中的-建造者模式
若是不知道此模式的夥伴先去把它搞懂,我這裏就先簡單的說一下: 定義:建造者模式是設計模式的一種,將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示。socket
當建立複雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時。 當構造過程必須容許被構造的對象有不一樣表示時。學習
能夠在網上上找找建造者模式的例子去學習一下,學習以後能夠經過建造者模式去模仿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 網絡攔截器
等等等等,我就不一一列出了,這些若是開始不知道是幹什麼的,能夠用谷歌翻譯去翻譯類開頭的註釋或者成員變量的名字,開始會好理解一下的。我也是這樣翻譯的。 至於每一個成員變量的具體原理咱們分析到它時再具體講解... 你們能夠關注個人微信公衆號:「秦子帥」一個有質量、有態度的公衆號!