OKHttp原始碼分析1 - 框架
1 OKHttp介紹
網路庫一直是Android APP開發中至關重要的庫,關係到載入速度,流量消耗等諸多問題。Android系統提供了HttpClient和HttpURLConnection兩個網路庫。相比HttpClient,OKHttp效能更好,且API設計更加易用。相比HttpURLConnection,OKHttp功能更加強大。目前採用OKHttp方案的APP越來越多,搞懂它的底層原始碼有助於我們更好的優化APP中網路方案,更快定位bug。也能學到很多好的設計模式。所以是時候搞懂OKHttp的原始碼了!
2 OKHttp框架
OKHttp分為兩層,上層主要提供API給使用者呼叫,實現了request的建立和傳送。底層依據Http協議為上層提供sendRequest(), readResponse()和followUpRequest()等方法。
OKHttp分層十分清晰,上層與Http協議關聯不大,而底層則依據Http協議實現了三個關鍵方法。這種良好的設計模式有利於以後在框架中加入對除了Http之外的協議的支援。目前有些團隊已經在研究基於TCP來實現網路庫。
根據OKHttp的分層,後面分別通過兩篇文章來詳細講述。
OKHttp原始碼分析2 - Request的建立和傳送
OKHttp原始碼分析3 - HttpEngine底層實現
3 我的封裝網路庫的SDK
目前網路庫,不論是Google自家的,還是第三方庫,都非常多。無恥的在這裡打個廣告。我寫了一個網路SDK,使用的例子如下。
NetLoader
.with(this )
.url("https://www.baidu.com/")
.listener(new NetRequestListener() {
@Override
public void onStarted() {
}
@Override
public void onSucceed(Object result) {
Toast.makeText(MainActivity.this , (String) result, Toast.LENGTH_SHORT).show();
}
@Override
public void onFailed(Exception e) {
}
})
.emptyView(new EmptyView(this) {
@Override
public void resetAsFetching() {
}
@Override
public void resetAsFailed() {
}
@Override
public void resetAsEmpty() {
}
})
.load();
它有如下優點:
1)提供了對不同網路庫的統一封裝。大家可以使用封裝後的API來開發,更換底層網路庫不需要更改app程式碼。
2)支援網路請求Request跟隨Activity或Fragment生命週期。也就是Activity destroy時,Request自動finish;Activity stop時,Request暫停;Activity restart時,Request繼續進行。(類似於Glide的處理方式)。這樣使用者完全不同擔心Request 沒有finish,導致網路資源沒有釋放的情況。
3)支援網路載入中,載入資料為空,載入失敗等不同View畫面展示。
4)用gradle來管理多個網路庫的新增和更改,一行程式碼就可以搞定更換網路庫這個相對比較麻煩的事情。
SDK分為APP層和SDK層。APP層中有使用sdk API的demo頁面。大家需要下載兩個git,並將它們放在同一個目錄底下。目前SDK中除了加入了網路庫封裝外,還封裝了圖片庫和Json解析庫。我會將更多的常用庫做好封裝。使用這些封裝好的庫,你可以分分鐘開發出一個高大上的APP。
雙手奉上SDK的地址:
https://github.com/xieyangyi/FrameApp.git
https://github.com/xieyangyi/FrameSdk.git