android網絡請求哪家強


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 的具體使用方法這裏就不贅述,地址在這裏:


square.github.io/okhttp



3. Volley

Volley 是 Google 官方出的一套小而巧的異步請求庫,該框架封裝的擴展性很強,支持 HttpClient、HttpUrlConnection,甚至支持 OkHttp,具體方法可以看 Jake 大神的這個 Gist 文件:


gist.github.com/JakeWha


而且 Volley 裏面也封裝了 ImageLoader ,所以如果你願意你甚至不需要使用圖片加載框架,不過這塊功能沒有一些專門的圖片加載框架強大,對於簡單的需求可以使用,對於稍複雜點的需求還是需要用到專門的圖片加載框架。


Volley 也有缺陷,比如不支持 post 大數據,所以不適合上傳文件。不過 Volley 設計的初衷本身也就是爲頻繁的、數據量小的網絡請求而生!

關於 Volley 的具體用法可以見我很早在 GitHub 的一個 demo :


github.com/stormzhang/A



4. Retrofit

Retrofit 是 Square 公司出品的默認基於 OkHttp 封裝的一套 RESTful 網絡請求框架,不瞭解 RESTful 概念的不妨去搜索學習下,RESTful 可以說是目前流行的一套 api 設計的風格,並不是標準。Retrofit 的封裝可以說是很強大,裏面涉及到一堆的設計模式,你可以通過註解直接配置請求,你可以使用不同的 http 客戶端,雖然默認是用 http ,可以使用不同 Json Converter 來序列化數據,同時提供對 RxJava 的支持,使用 Retrofit + OkHttp + RxJava + Dagger2 可以說是目前比較潮的一套框架,但是需要有比較高的門檻。


Retrofit 的具體使用方法與地址在這裏:


square.github.io/retrof



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 怎麼選擇隨你便唄。

發佈了39 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章