本篇說的網絡請求專指 http 請求,在選擇一個框架以前,我我的有個習慣,就是我喜歡選擇專一的庫,其實在軟件設計領域有一個原則叫作 「單一職責原則」,跟我所說的「專一」不謀而合,一個庫能把一件事作好就很不錯了。現現在有不少大而全的庫,好比這個庫能夠網絡請求,同時又能夠圖片加載,又能夠數據存儲,又能夠 View 註解等等,咱們使用這種庫固然方便了,可是你有沒有想過?這樣會使得你整個項目對它依賴性太強,萬一之後這個庫不維護了,或者中間某個模塊出問題了,這個影響很是大,並且我一直認爲大而全的框架可能某一塊都作的不夠好,因此我在選擇的時候更喜歡專一某一領域的框架。android
在上面原則的基礎上,因此目前來講單純的網絡請求庫就鎖定在了 Volley、OkHttp、Retrofit 三個,android-async-http 的做者已經不維護,因此這裏就很少說了,下面咱們分別來講說這三個庫的區別。git
咱們知道在 Android 開發中是能夠直接使用現成的 api 進行網絡請求的,就是使用 HttpClient、HttpUrlConnection 進行操做,目前 HttpClient 已經被廢棄,而 android-async-http 是基於 HttpClient 的,我想可能也是由於這個緣由做者放棄維護。 github
而 OkHttp 是 Square 公司開源的針對 Java 和 Android 程序,封裝的一個高性能 http 請求庫,因此它的職責跟 HttpUrlConnection 是同樣的,支持 spdy、http 2.0、websocket ,支持同步、異步,並且 OkHttp 又封裝了線程池,封裝了數據轉換,封裝了參數使用、錯誤處理等,api 使用起來更加方便。能夠把它理解成是一個封裝以後的相似 HttpUrlConnection 的一個東西,可是你在使用的時候仍然須要本身再作一層封裝,這樣才能像使用一個框架同樣更加順手。 web
OkHttp 的具體使用方法這裏就不贅述,地址在這裏: 設計模式
http://square.github.io/okhttp/api
Volley 是 Google 官方出的一套小而巧的異步請求庫,該框架封裝的擴展性很強,支持 HttpClient、HttpUrlConnection,甚至支持 OkHttp,具體方法能夠看 Jake 大神的這個 Gist 文件:websocket
https://gist.github.com/JakeWharton/5616899網絡
並且 Volley 裏面也封裝了 ImageLoader ,因此若是你願意你甚至不須要使用圖片加載框架,不過這塊功能沒有一些專門的圖片加載框架強大,對於簡單的需求可使用,對於稍複雜點的需求仍是須要用到專門的圖片加載框架。 框架
Volley 也有缺陷,好比不支持 post 大數據,因此不適合上傳文件。不過 Volley 設計的初衷自己也就是爲頻繁的、數據量小的網絡請求而生! 異步
關於 Volley 的具體用法能夠見我很早在 GitHub 的一個 demo :
https://github.com/stormzhang/AndroidVolley
Retrofit 是 Square 公司出品的默認基於 OkHttp 封裝的一套 RESTful 網絡請求框架,不瞭解 RESTful 概念的不妨去搜索學習下,RESTful 能夠說是目前流行的一套 api 設計的風格,並非標準。Retrofit 的封裝能夠說是很強大,裏面涉及到一堆的設計模式,你能夠經過註解直接配置請求,你可使用不一樣的 http 客戶端,雖然默認是用 http ,可使用不一樣 Json Converter 來序列化數據,同時提供對 RxJava 的支持,使用 Retrofit + OkHttp + RxJava + Dagger2 能夠說是目前比較潮的一套框架,可是須要有比較高的門檻。
Retrofit 的具體使用方法與地址在這裏:
http://square.github.io/retrofit/
毫無疑問 Volley 的優點在於封裝的更好,而使用 OkHttp 你須要有足夠的能力再進行一次封裝。而 OkHttp 的優點在於性能更高,由於 OkHttp 基於 NIO 和 Okio ,因此性能上要比 Volley更快。
估計有些讀者不理解 IO 和 NIO 的概念,這裏姑且簡單提下,這兩個都是 Java 中的概念,若是我從硬盤讀取數據,第一種方式就是程序一直等,數據讀完後才能繼續操做,這種是最簡單的也叫阻塞式 IO,還有一種就是你讀你的,我程序接着往下執行,等數據處理完你再來通知我,而後再處理回調。而第二種就是 NIO 的方式,非阻塞式。
因此 NIO 固然要比 IO 的性能要好了, 而 Okio 是 Square 公司基於 IO 和 NIO 基礎上作的一個更簡單、高效處理數據流的一個庫。
理論上若是 Volley 和 OkHttp 對比的話,我更傾向於使用 Volley,由於 Volley 內部一樣支持使用 OkHttp ,這點 OkHttp 的性能優點就沒了,並且 Volley 自己封裝的也更易用,擴展性更好些。
毫無疑問,Retrofit 默認是基於 OkHttp 而作的封裝,這點來講沒有可比性,確定首選 Retrofit。
這兩個庫都作了很是不錯的封裝,可是 Retrofit 解耦的更完全,尤爲 Retrofit 2.0 出來,Jake 對以前 1.0 設計不合理的地方作了大量重構,職責更細分,並且 Retrofit 默認使用 OkHttp ,性能上也要比 Volley 佔優點,再有若是你的項目若是採用了 RxJava ,那更該使用 Retrofit 。
因此說這兩個庫相比,Retrofit 毫無疑問更有優點,你在能掌握兩個框架的前提下該優先使用 Retrofit。可是我的認爲 Retrofit 門檻要比 Volley 稍高些,你要理解他的原理,各類用法,想完全搞明白仍是須要花些功夫的,若是你對它只知其一;不知其二,那仍是建議在商業項目使用 Volley 吧。
因此綜上,若是以上三種網絡庫你都能熟練掌握,那麼優先推薦使用 Retrofit ,前提是最好大家的後臺 api 也能遵循 RESTful 的風格,其次若是你不想使用或者沒能力掌握 Retrofit ,那麼推薦使用 Volley ,畢竟 Volley 你不須要作過多的封裝,固然若是大家須要上傳大數據,那麼不建議使用 Volley,不然你該採用 OkHttp 。
最後,我知道可能有些人會糾結 Volley 與 OkHttp 的選擇,那是由於我認爲 OkHttp 仍是須要必定的能力作一層封裝的,若是你有能力封裝的話那不如直接用 Retrofit 了,若是沒能力封裝仍是乖乖的用 Volley 吧,若是你能有一些不錯的基於 OkHttp 封裝好的開源庫,那麼另說了,Volley 與 OkHttp 怎麼選擇隨你便唄。
最最後,以上只是我一家之言,若有誤導,概不負責!歡迎討論與交流。