Android開源項目推薦之「網路請求哪家強」
不少人老催這個系列,好吧,今天就更新一篇乾貨給你們。網路請求這個話題基本是所有 App 開發都會遇到的,這也難怪之前很多人留言讓我寫寫網路請求到底該怎麼選擇,今天就來說說網路請求到底哪家強!
1. 原則
本篇說的網路請求專指 http 請求,在選擇一個框架之前,我個人有個習慣,就是我喜歡選擇專註的庫,其實在軟體設計領域有一個原則叫做 「單一職責原則」,跟我所說的「專註」不謀而合,一個庫能把一件事做好就很不錯了。現如今有很多大而全的庫,比如這個庫可以網路請求,同時又可以圖片載入,又可以數據存儲,又可以 View 註解等等,我們使用這種庫當然方便了,但是你有沒有想過?這樣會使得你整個項目對它依賴性太強,萬一以後這個庫不維護了,或者中間某個模塊出問題了,這個影響非常大,而且我一直認為大而全的框架可能某一塊都做的不夠好,所以我在選擇的時候更喜歡專註某一領域的框架。
在上面原則的基礎上,所以目前來說單純的網路請求庫就鎖定在了 Volley、OkHttp、Retrofit 三個,android-async-http 的作者已經不維護,所以這裡就不多說了,下面我們分別來說說這三個庫的區別。
2. OkHttp
我們知道在 Android 開發中是可以直接使用現成的 api 進行網路請求的,就是使用 HttpClient、HttpUrlConnection 進行操作,目前 HttpClient 已經被廢棄,而 android-async-http 是基於 HttpClient 的,我想可能也是因為這個原因作者放棄維護。
而 OkHttp 是 Square 公司開源的針對 Java 和 Android 程序,封裝的一個高性能 http 請求庫,所以它的職責跟 HttpUrlConnection 是一樣的,支持 spdy、http 2.0、websocket ,支持同步、非同步,而且 OkHttp 又封裝了線程池,封裝了數據轉換,封裝了參數使用、錯誤處理等,api 使用起來更加方便。可以把它理解成是一個封裝之後的類似 HttpUrlConnection 的一個東西,但是你在使用的時候仍然需要自己再做一層封裝,這樣才能像使用一個框架一樣更加順手。
OkHttp 的具體使用方法這裡就不贅述,地址在這裡:
http://square.github.io/okhttp/
3. Volley
Volley 是 Google 官方出的一套小而巧的非同步請求庫,該框架封裝的擴展性很強,支持 HttpClient、HttpUrlConnection,甚至支持 OkHttp,具體方法可以看 Jake 大神的這個 Gist 文件:
https://gist.github.com/JakeWharton/5616899
而且 Volley 裡面也封裝了 ImageLoader ,所以如果你願意你甚至不需要使用圖片載入框架,不過這塊功能沒有一些專門的圖片載入框架強大,對於簡單的需求可以使用,對於稍複雜點的需求還是需要用到專門的圖片載入框架。
Volley 也有缺陷,比如不支持 post 大數據,所以不適合上傳文件。不過 Volley 設計的初衷本身也就是為頻繁的、數據量小的網路請求而生!
關於 Volley 的具體用法可以見我很早在 GitHub 的一個 demo :
https://github.com/stormzhang/AndroidVolley
4. Retrofit
Retrofit 是 Square 公司出品的默認基於 OkHttp 封裝的一套 RESTful 網路請求框架,不了解 RESTful 概念的不妨去搜索學習下,RESTful 可以說是目前流行的一套 api 設計的風格,並不是標準。Retrofit 的封裝可以說是很強大,裡面涉及到一堆的設計模式,你可以通過註解直接配置請求,你可以使用不同的 http 客戶端,雖然默認是用 http ,可以使用不同 Json Converter 來序列化數據,同時提供對 RxJava 的支持,使用 Retrofit + OkHttp + RxJava + Dagger2 可以說是目前比較潮的一套框架,但是需要有比較高的門檻。
Retrofit 的具體使用方法與地址在這裡:
http://square.github.io/retrofit/
5. Volley VS OkHttp
毫無疑問 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 本身封裝的也更易用,擴展性更好些。
6. OkHttp VS Retrofit
毫無疑問,Retrofit 默認是基於 OkHttp 而做的封裝,這點來說沒有可比性,肯定首選 Retrofit。
7. Volley VS Retrofit
這兩個庫都做了非常不錯的封裝,但是 Retrofit 解耦的更徹底,尤其 Retrofit 2.0 出來,Jake 對之前 1.0 設計不合理的地方做了大量重構,職責更細分,而且 Retrofit 默認使用 OkHttp ,性能上也要比 Volley 佔優勢,再有如果你的項目如果採用了 RxJava ,那更該使用 Retrofit 。
所以說這兩個庫相比,Retrofit 毫無疑問更有優勢,你在能掌握兩個框架的前提下該優先使用 Retrofit。但是個人認為 Retrofit 門檻要比 Volley 稍高些,你要理解他的原理,各種用法,想徹底搞明白還是需要花些功夫的,如果你對它一知半解,那還是建議在商業項目使用 Volley 吧。
8. 總結
所以綜上,如果以上三種網路庫你都能熟練掌握,那麼優先推薦使用 Retrofit ,前提是最好你們的後台 api 也能遵循 RESTful 的風格,其次如果你不想使用或者沒能力掌握 Retrofit ,那麼推薦使用 Volley ,畢竟 Volley 你不需要做過多的封裝,當然如果你們需要上傳大數據,那麼不建議使用 Volley,否則你該採用 OkHttp 。
最後,我知道可能有些人會糾結 Volley 與 OkHttp 的選擇,那是因為我認為 OkHttp 還是需要一定的能力做一層封裝的,如果你有能力封裝的話那不如直接用 Retrofit 了,如果沒能力封裝還是乖乖的用 Volley 吧,如果你能有一些不錯的基於 OkHttp 封裝好的開源庫,那麼另說了,Volley 與 OkHttp 怎麼選擇隨你便唄。
最最後,以上只是我一家之言,如有誤導,概不負責!歡迎討論與交流。
相關閱讀:
Android開源項目推薦之「圖片載入到底哪家強」
本文原創發佈於微信公眾號 AndroidDeveloper「googdev」,不僅是Android原創乾貨分享,也許是最有人情味的技術公眾號,轉載請務必註明出處!
推薦閱讀:
※Google是如何從Android中盈利的?
※點點網有android客戶端嗎?
※如何看待Flyme OS 即將開放適配其他機型?
※如何評價魅族在MWC上展示的快充技術?
※安卓8.1加入神經網路API ,拉開了消費級人工智慧終端化的序幕