1. 程式人生 > >OKHttp原始碼分析1 - 框架

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