1. 程式人生 > >Android 開源網路框架(Android-Async-Http、Volley、OkHttp3、Retrofit2.0)對比

Android 開源網路框架(Android-Async-Http、Volley、OkHttp3、Retrofit2.0)對比

思維導圖
一、為什麼要使用網路開源框架 1. Android系統自帶網路請求 Android系統自帶的網路請求模組有兩個,一個是HttpClient,另一個是HttpUrlConnection。 1.1. HttpUrlConnection HttpURLConnection是一種多用途、輕量極的HTTP客戶端,使用它來進行HTTP操作可以適用於大多數的應用程式。雖然HttpURLConnection的API提供的比較簡單,但是同時這也使得我們可以更加容易地去使用和擴充套件它。 不過在Android 2.2版本之前,HttpURLConnection一直存在著一些令人厭煩的bug。比如說對一個可讀的InputStream呼叫close()方法時,就有可能會導致連線池失效了。那麼我們通常的解決辦法就是直接禁用掉連線池的功能,所以Android2.2以前是推薦用HttpClient的。 而在Android 2.3版本及以後,HttpURLConnection則是最佳的選擇。它的API簡單,體積較小,因而非常適用於Android專案。壓縮和快取機制可以有效地減少網路訪問的流量,在提升速度和省電方面也起到了較大的作用。對於新的應用程式應該更加偏向於使用HttpURLConnection,因為在以後的工作當中我們也會將更多的時間放在優化HttpURLConnection上面。
1.2. HttpClient DefaultHttpClient和它的兄弟AndroidHttpClient都是HttpClient具體的實現類,它們都擁有眾多的API,而且實現比較穩定,bug數量也很少。 但同時也由於HttpClient的API數量過多,使得我們很難在不破壞相容性的情況下對它進行升級和擴充套件,所以目前Android團隊在提升和優化HttpClient方面的工作態度並不積極。 3. 存在的問題 ①上述兩個框架並沒有針對非同步呼叫的一個封裝,使用時必須自己去new一個執行緒; ②沒有執行緒池,沒有網路快取,不能重複利用請求,效能不佳; ③返回的資料必須自己解析,沒有json解析框架。 2. 網路開源框架的可以解決那些問題
網路請求開源庫是一個將網路請求的相關功能封裝好的類庫,並對外提供Api: 沒有網路請求框架之前 App想與伺服器進行網路請求互動是一件很痛苦的事:因為Android的主執行緒不能進行網路請求,還需要另外開一個執行緒進行請求,然後又要考慮到執行緒池,快取等一堆問題。 使用網路請求框架後 實現網路請求的需求同時不需要考慮:非同步請求、執行緒池、快取、json解析
  • 同時還:降低開發難度,縮短開發週期,使用方便
    、目前流行的網路框架
1. 目前流行的網路框架有哪些 目前流行的框架主要有四種:Android-Async-Http、Volley、OkHttp3、Retrofit2.0 網路請求框架本質上是一個將網路請求的相關方法( HttpClient或HttpURLConnection)封裝好的類庫,並實現另開執行緒進行請求和處理資料,從而實現整個網路請求模組的功能。具體的關係可看下圖:

2. Android-Async-Http 推出的時間最早,目前作者已經停止更新,Android 5.0後不推薦使用。特點: ①自動智慧請求重試 ②支援同步、非同步請求 ③儲存cookie到應用的sharepreference 自動智慧請求重試在很多APP中比較雞肋,在很多下拉重新整理的APP中使用者體驗很不好,而且框架中自動重試是預設開啟的,需要去顯式的關閉。 3. Volley 基於HttpUrlConnection,Volley的request請求和response都是把資料放在byte數組裡,不支援輸入輸出流。如果大檔案多了,陣列就會非常大,消耗記憶體,所以volley不適用下載和上傳檔案的網路操作。適合輕量級網路互動,網路請求頻繁,傳輸資料量小的場景。 ①封裝了UIL圖片載入框架,支援圖片載入 ②網路請求排序,優先順序處理 ③多級別取消 ④和activity生命舟曲聯動,生命週期結束同時取消所有網路請求 ⑤擴充套件性好,可支援okhttp 4. OkHttp3 不基於HttpClient和HttpUrlConnection,是比前兩種更高效能的網路請求,它是一個封裝類似HttpUrlConnection的一個東西,Android 4.4之後HttpUrlConnnection部分實現已經與okhttp一致,證明了okhttp的高效能。特點: ①支援PDY,共享同一個socket來處理同一個伺服器的所有請求 ②支援同步、非同步請求 ③儲存cookie到應用的sharepreference ④封裝了執行緒池、資料轉換、引數使用、錯誤處理等 ⑤無縫的支援GZIP來減少資料流量,使用比HttpUrlConnection更方便 ⑥快取響應資料來較少重複的網路請求 ⑦能從很多常用的連線問題中自動恢復 ⑧解決了代理伺服器問題和SSL握手失敗問題 ⑨基於NIO和okio,所以效能更好,請求、處理速度快 5. Retrofit2.0 基於Okhttp,而且更為出色,具有okhttp所有的優點,而且 ①restful api設計風格 ②通過註解配置請求,包括請求方法、請求引數、請求頭、返回值等 ③可以搭配多種Converter將獲得的資料解析,支援Gson、jackson、Protobur等 ④提供Rxjava支援 Retrofit2.0效能最好,簡潔易用,可擴充套件rxjava,但是缺點也很明顯,註解、rxjava等的使用存在很高的門檻;擴充套件性較差,高度封裝後的必然結果。 三、總結 我們分析了Android系統自帶和網路請求模組和存在的問題,針對這些問題,我們分析了現在流行的網路請求框架他們各自的特點。那麼到底哪一種最適合你呢,我的觀點是要根據不同的階段。 初級工程師往往對網路請求一知半解,如果貿然使用了retrfit2.0,不單各種的註解會迷惑,熟練的掌握了使用方法後,對於執行緒池、快取為什麼好不會有很實際的認知,需要研究原始碼和大量理論,如何將他們串聯起來是個問題。所以這個階段首先是去基於HttpClient、HttpUrlConnection做一些簡單的封裝,然後你才會真實的瞭解到請求封裝、執行緒池封裝的好處。 中級工程師工程階段任務大多是根據業務需求設計某個模組,網路框架可能已經選好,你首先要去了解這個網路框架中內部的原理,有哪些特性,可以解決遇到的問題嗎,不能解決就去尋找一個開源方案,這個解決的方案不能是一個全新的網路框架,一個專案存在兩個網路框架往往會帶來很多問題,而且架構師基於效能的考慮也是不會允許的。所以為解決一個小問題,往往適合去尋找或者自行設計一個儘可能小的封裝。所以這個階段就是了解已定好的網路框架內部原理。 高階工程師一般是一個專案中擔任架構選型的任務,他們已然瞭解了http請求、執行緒池、快取的知識,基於以往專案的經驗,選擇一個高效能、簡潔易用的網路架構,那麼基於okhttp封裝的retrofit2.0是不二選擇,而且支援converter擴充套件和rxjava,擴充套件性不好對他們高超的重構和封裝技巧不再是問題。