### 前言 上篇文章我們講了[Okhttp的基本用法](https://www.jianshu.com/p/8e404d9c160f),今天根據上節講到請求流程來分析源碼,那麼第一步就是實例化OkHttpClient對象,所以我們今天主要分析下OkHttpClient源碼! #### 初始化-構造 ...
### 前言 上篇文章我們講了[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)