Android開源項目推薦之「網(wǎng)絡(luò)請求哪家強」

不少人老催這個系列,好吧,今天就更新一篇干貨給你們。網(wǎng)絡(luò)請求這個話題基本是所有 App 開發(fā)都會遇到的,這也難怪之前很多人留言讓我寫寫網(wǎng)絡(luò)請求到底該怎么選擇,今天就來說說網(wǎng)絡(luò)請求到底哪家強!

1. 原則

本篇說的網(wǎng)絡(luò)請求專指 http 請求,在選擇一個框架之前,我個人有個習(xí)慣,就是我喜歡選擇專注的庫,其實在軟件設(shè)計領(lǐng)域有一個原則叫做 「單一職責(zé)原則」,跟我所說的「專注」不謀而合,一個庫能把一件事做好就很不錯了?,F(xiàn)如今有很多大而全的庫,比如這個庫可以網(wǎng)絡(luò)請求,同時又可以圖片加載,又可以數(shù)據(jù)存儲,又可以 View 注解等等,我們使用這種庫當(dāng)然方便了,但是你有沒有想過?這樣會使得你整個項目對它依賴性太強,萬一以后這個庫不維護了,或者中間某個模塊出問題了,這個影響非常大,而且我一直認為大而全的框架可能某一塊都做的不夠好,所以我在選擇的時候更喜歡專注某一領(lǐng)域的框架。

在上面原則的基礎(chǔ)上,所以目前來說單純的網(wǎng)絡(luò)請求庫就鎖定在了 Volley、OkHttp、Retrofit 三個,android-async-http 的作者已經(jīng)不維護,所以這里就不多說了,下面我們分別來說說這三個庫的區(qū)別。

2. OkHttp

我們知道在 Android 開發(fā)中是可以直接使用現(xiàn)成的 api 進行網(wǎng)絡(luò)請求的,就是使用 HttpClient、HttpUrlConnection 進行操作,目前 HttpClient 已經(jīng)被廢棄,而 android-async-http 是基于 HttpClient 的,我想可能也是因為這個原因作者放棄維護。

而 OkHttp 是 Square 公司開源的針對 Java 和 Android 程序,封裝的一個高性能 http 請求庫,所以它的職責(zé)跟 HttpUrlConnection 是一樣的,支持 spdy、http 2.0、websocket ,支持同步、異步,而且 OkHttp 又封裝了線程池,封裝了數(shù)據(jù)轉(zhuǎn)換,封裝了參數(shù)使用、錯誤處理等,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 ,所以如果你愿意你甚至不需要使用圖片加載框架,不過這塊功能沒有一些專門的圖片加載框架強大,對于簡單的需求可以使用,對于稍復(fù)雜點的需求還是需要用到專門的圖片加載框架。

Volley 也有缺陷,比如不支持 post 大數(shù)據(jù),所以不適合上傳文件。不過 Volley 設(shè)計的初衷本身也就是為頻繁的、數(shù)據(jù)量小的網(wǎng)絡(luò)請求而生!

關(guān)于 Volley 的具體用法可以見我很早在 GitHub 的一個 demo :

```

https://github.com/stormzhang/AndroidVolley


4. Retrofit

Retrofit 是 Square 公司出品的默認基于 OkHttp 封裝的一套 RESTful 網(wǎng)絡(luò)請求框架,不了解 RESTful 概念的不妨去搜索學(xué)習(xí)下,RESTful 可以說是目前流行的一套 api 設(shè)計的風(fēng)格,并不是標(biāo)準(zhǔn)。Retrofit 的封裝可以說是很強大,里面涉及到一堆的設(shè)計模式,你可以通過注解直接配置請求,你可以使用不同的 http 客戶端,雖然默認是用 http ,可以使用不同 Json Converter 來序列化數(shù)據(jù),同時提供對 RxJava 的支持,使用 Retrofit + OkHttp + RxJava + Dagger2 可以說是目前比較潮的一套框架,但是需要有比較高的門檻。

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

http://square.github.io/retrofit/

5. Volley VS OkHttp

毫無疑問 Volley 的優(yōu)勢在于封裝的更好,而使用 OkHttp 你需要有足夠的能力再進行一次封裝。而 OkHttp 的優(yōu)勢在于性能更高,因為 OkHttp 基于 NIO 和 Okio ,所以性能上要比 Volley更快。

估計有些讀者不理解 IO 和 NIO 的概念,這里姑且簡單提下,這兩個都是 Java 中的概念,如果我從硬盤讀取數(shù)據(jù),第一種方式就是程序一直等,數(shù)據(jù)讀完后才能繼續(xù)操作,這種是最簡單的也叫阻塞式 IO,還有一種就是你讀你的,我程序接著往下執(zhí)行,等數(shù)據(jù)處理完你再來通知我,然后再處理回調(diào)。而第二種就是 NIO 的方式,非阻塞式。

所以 NIO 當(dāng)然要比 IO 的性能要好了, 而 Okio 是 Square 公司基于 IO 和 NIO 基礎(chǔ)上做的一個更簡單、高效處理數(shù)據(jù)流的一個庫。

理論上如果 Volley 和 OkHttp 對比的話,我更傾向于使用 Volley,因為 Volley 內(nèi)部同樣支持使用 OkHttp ,這點 OkHttp 的性能優(yōu)勢就沒了,而且 Volley 本身封裝的也更易用,擴展性更好些。

6. OkHttp VS Retrofit

毫無疑問,Retrofit 默認是基于 OkHttp 而做的封裝,這點來說沒有可比性,肯定首選 Retrofit。

7. Volley VS Retrofit

這兩個庫都做了非常不錯的封裝,但是 Retrofit 解耦的更徹底,尤其 Retrofit 2.0 出來,Jake 對之前 1.0 設(shè)計不合理的地方做了大量重構(gòu),職責(zé)更細分,而且 Retrofit 默認使用 OkHttp ,性能上也要比 Volley 占優(yōu)勢,再有如果你的項目如果采用了 RxJava ,那更該使用 Retrofit 。

所以說這兩個庫相比,Retrofit 毫無疑問更有優(yōu)勢,你在能掌握兩個框架的前提下該優(yōu)先使用 Retrofit。但是個人認為 Retrofit 門檻要比 Volley 稍高些,你要理解他的原理,各種用法,想徹底搞明白還是需要花些功夫的,如果你對它一知半解,那還是建議在商業(yè)項目使用 Volley 吧。

8. 總結(jié)

所以綜上,如果以上三種網(wǎng)絡(luò)庫你都能熟練掌握,那么優(yōu)先推薦使用 Retrofit ,前提是最好你們的后臺 api 也能遵循 RESTful 的風(fēng)格,其次如果你不想使用或者沒能力掌握 Retrofit ,那么推薦使用 Volley ,畢竟 Volley 你不需要做過多的封裝,當(dāng)然如果你們需要上傳大數(shù)據(jù),那么不建議使用 Volley,否則你該采用 OkHttp 。

最后,我知道可能有些人會糾結(jié) Volley 與 OkHttp 的選擇,那是因為我認為 OkHttp 還是需要一定的能力做一層封裝的,如果你有能力封裝的話那不如直接用 Retrofit 了,如果沒能力封裝還是乖乖的用 Volley 吧,如果你能有一些不錯的基于 OkHttp 封裝好的開源庫,那么另說了,Volley 與 OkHttp 怎么選擇隨你便唄。

最最后,以上只是我一家之言,如有誤導(dǎo),概不負責(zé)!歡迎討論與交流。

相關(guān)閱讀:

Android開源項目推薦之「圖片加載到底哪家強」

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容