okhttp 流程和優化的實現

2021-08-18 03:59:53 字數 4047 閱讀 5799

最近一直在忙著研究 okhttp,看了兩周了,感覺東西實在是太多了,如果讓我細緻的寫,我感覺能寫 10 篇都寫不完,那東西雖然是很多,但是主要的流程我們還是需要了解的,這篇文章我主要介紹以下 okhttp 中的流程,還有一些做的好的東西,之後再去將一些細節上的東西,這篇文章主要說了乙個大概的內容,就是幫助你大致了解一下 okhttp 的實現,廢話不多說了下面進入正題。 

我們首先看一下網路上面很流行的一張,這張基本涵蓋了乙個整個的流程,下面我就對這張進行一一的說明:

2、獲取 response 的過程,我們首先通過遞迴(index+1 的方式實現遞迴的)的方式乙個乙個的加入***,***首先加入的是我們的自定義的***,然後去加框架自己的***,那這幾個***的主要功能如下:

1、retryandfollowupinterceptor(負責失敗重試,重定向的)

概述:主要的作用就是請求時候建立乙個 streamallocation 物件,這個物件建立的時候會根據請求的協議不同建立不一樣的物件

2、bridgeinterceptor(負責把使用者構造的請求轉換為傳送到伺服器的請求、把伺服器返回的響應轉換為使用者友好的響應的)

概述:主要就是把我們的 request 請求加上一些請求頭,打包成真正的網路請求的 request,在請求返回的時候,通過 gzip 把我們能的 response 進行壓縮

3、cacheinterceptor(負責讀取快取的,如果有快取就攔截並返回,也負責更新快取)

概述:負責讀取我們的快取,如果我們設定了 cache,那麼先從這個裡面讀取,如果讀取不到的那麼就把 request 和 caseresponse 構建乙個 cahestategy 物件,然後判斷這個物件是否有效,如果有效則直接返回,如果無效,那麼我們請求,如果請求返回304,證明資源沒過期,我們可以讀取本地的快取

4、connectinterceptor(負責和伺服器建立連線的)

概述:這個就比較複雜了,這個裡面呢主要是進行 socket 的連線,在這個***裡首先獲取了乙個 streamallocation 物件,然後通過這個物件獲取了乙個 realconnection 物件,然後通過這個物件去獲取乙個 httpcode 物件,這個物件是乙個介面,那具體實現有兩種乙個是 http1,乙個是 http2,它會根據我們的請求建立不同的 httpcode ,通過這個物件可以進行下乙個***的操作,在我們獲取 realconnection 的同時我們呼叫了 connect 這個方法,這個方法底層呼叫的就是 socket.connect 的方法,就是進行了 socket 的連線了

5、配置 okhttpclient 時設定的 networkinterceptors

6、callserverinterceptor(負責向伺服器傳送請求資料、從伺服器讀取響應資料的)

概述:通過4建立的 httpcode 進行寫入資料,它是通過 okio 的 sink 進行寫入資料的,這個 sink 和outputstream 差不多,就相當於寫入流中資料,然後傳送到伺服器,這是請求部分。處理 response 的時候,他會讀取我們的返回的資料,通過 source,然後把資料封裝成 response 物件

注意:我們每個***在 intercept 方法中都會呼叫 process 這個方法,這個方法的作用就是去執行下乙個***,那麼如果我們自定義***的話,需要呼叫 chain.proceed 方法,不然的話我們的請求就會在***裡面卡主。

那麼非同步請求的東西大致就這麼多,還有很多細緻的東西之後會分享出來。

1、多路復用

概述:之前我們的請求是每一次請求會建立乙個鏈結,請求結束就關閉鏈結,我們都知道 tcp/ip 請求是需要握手的,那握手就會消耗相應的時間,所以在我們的 okhttp 中,我們會復用之前的鏈結進行請求,這樣請求速度就快了很多。

如果是這樣的話就會出現兩個問題,第一,我們怎麼判斷鏈結是否可用,第二是我們不需要的鏈結怎麼**。

從上面我們知道我們會在 streamallocation.newstream 方法中獲取 realconnection,在獲取的時候我們會判斷有沒有之前的鏈結可以復用,復用的條件是這樣判斷的:

1、如果此鏈結的負載數目超過指定數目(表現為realconnection的allocations集合的數量超過該鏈結指定的數量)或者nonewstreams為true時,此鏈結不可復用。 

2、streamallocation 所持有的address物件和realconnection的address非主機部分不同,則此鏈結不可復用。至於非主機部分的判定是在address的equalsnonhost方法來體現。

兩者adress物件的非主機部分相等的標準就是dns,authenticator物件、協議、ca授權驗證標準、埠等資訊全部相等。 

3、在1、2判定條件都為true的話,如果兩個address物件的host或者說url中的host一樣,則此鏈結可復用,正如注釋說說,新增1、2、3都滿足的話,那麼此時這個鏈結就是this connection is a perfect match。

第乙個問題我們解決了,現在我們來解決第二個問題,我們都知道鏈結如果多了我們如果不**的話就會卡死,那麼我們的鏈結是怎麼**的呢,鏈結**主要降到的就是 connectionpool 這個類,這個類中有乙個 clean up 方法,我們來看一下他裡面做了什麼:

clean up 方法:

標記清除法

1、首先標記出最不活躍的鏈結(空閒鏈結),之後進行清除

2、如果被標記的鏈結空閒 socket 超過 5 個,時間大於 5 分鐘,那麼直接清除。

3、如果此鏈結空閒,但是不足五分鐘,則返回剩餘時間,並進行標記,以供下次清除。

4、如果沒用空閒鏈結的話,則五分鐘之後再進行清理

1、遍歷其中的 streamallocation,判斷是否為空,如果為空,則沒有引用這個 streamallocation

2、如果引用數量為 0 ,則為空閒鏈結

多路復用的原理就講到這裡了,其實很簡單,只要吧 connectionpool 這個類看明白就很好理解了

2、快取

概述:我們都知道,好的框架都會有快取的功能,通過快取我們可以很快的訪問我們的資源,那 okhttp 也不例外,從上面的流程中我們可以看到, cacheinterceptor 主要是做快取的,那麼我們來了解一下他的流程是什麼:

okhttp 的快取策略是,key 為 request的 url 的 md5 值,value 為 response。

1、如果在 okhttpclient 初始化的時候配置了 cache,那麼我們則從快取中讀取 caseresponse。

2、如果沒有指定,那麼我們將 request 和 caseresponse 構建乙個 cachestrategy 的類

3、判斷 cachestrategy 是否有效,如果 request 和 caseresponse 都為空,直接返回 504

4、如果 request == null ,cacheresponse 不為空,則返回

5、如果為空,那麼我們就進行網路請求,如果返回了 304 且我們本地有快取,那麼說明我們的快取沒有過期,可以繼續使用

3、執行緒池的引入

概述:我們之前的請求都是每次都會新建執行緒去進行請求,這樣的話我們如果有 100 個請求就會有 100 個執行緒,那麼會消耗很大的資源,當引入執行緒池之後,我們就不需要頻繁的去建立執行緒,而且可以復用執行緒,這樣就很節省時間了。

4、可以進行壓縮

在流程中我們講到,當我們 response 通過 bridgeinterceptor 處理的時候會進行 gzip 壓縮,這樣可以大大減小我們的 response ,他不是什麼情況下都壓縮的,只有支援的時候才會 進行壓縮。

其實還有乙個是重連和重定向,現在還沒弄懂,之後再去分享吧

1、建造者模式,不管是構建乙個 okhttpclient 或者 request 都是很複雜的,所以在 okhttp 框架中使用了建造者模式去建立這兩個物件。

2、其實我認為 okhttp 最好的就是他的***的設計,通過遞迴呼叫的方法去乙個乙個的攔截,最後在乙個乙個的處理,這樣形成一條鏈路,讓我們操作起來非常方便

好了,今天的東西就講到這裡吧,其實主要講的都是一些流程上面的東西,而且講的很粗略,沒有那麼細緻,如果想深入了解的話還需要去看一下原始碼是怎麼寫的,這樣會很深入的理解 okhttp 。

BPI 流程優化和BPR流程重組

bpr 業務流程重組 則是對企業流程大規模和徹底的變革,甚至有可能是推倒重來。由於bpr過於劇烈,陣痛太強,已經逐步被理性的企業拋棄。bpi 業務流程優化 更多的強調區域性 漸進性性的針對現有流程進行小規模的改善,而不是徹底性的否定或顛覆,這種工作方法更適合於企業自我開展的內部流程優化工作。而我們倡...

iOS內購實現流程和丟單優化

客戶端流程 這裡只做個總結,網上有很多詳細的介紹,這裡就不多講 1.itc新增商品 2.itc新增沙盒測試賬號 3.新增銀行資訊 這一步一定要有,不然呼叫支付會出現invalid productid情況 4.啟動支付介面 5.支付成功後,會返回乙個json資料串receipt,把這個receipt用...

流程設計和優化原則

該文根據安達信流程設計培訓資料整理。流程的定義 流程是一系列活動的組合,這一組合接受各種投入要素,包括 資訊 資金 人員 技術 文件等。最後通過流程產生所期望的結果,包括產品 服務或某種決策結果。流程四大構成要素 組織架構,客戶滿意度,轉變促成,績效管理和標竿 現有流程評價和未來流程設計 流程設計應...