我們知道在 Android 開發(fā)中是可以直接使用現(xiàn)成的 api 進(jìn)行網(wǎng)絡(luò)請求的,就是使用 HttpClient、HttpUrlConnection 進(jìn)行操作,目前 HttpClient 已經(jīng)被廢棄,而 android-async-http 是基于 HttpClient 的,我想可能也是因為這個原因作者放棄維護(hù)。
而 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/
2. Volley
Volley 是 Google 官方出的一套小而巧的異步請求庫,該框架封裝的擴(kuò)展性很強(qiáng),支持 HttpClient、HttpUrlConnection,甚至支持 OkHttp,具體方法可以看 Jake 大神的這個 Gist 文件:
https://gist.github.com/JakeWharton/5616899
而且 Volley 里面也封裝了 ImageLoader ,所以如果你愿意你甚至不需要使用圖片加載框架,不過這塊功能沒有一些專門的圖片加載框架強(qiáng)大,對于簡單的需求可以使用,對于稍復(fù)雜點(diǎn)的需求還是需要用到專門的圖片加載框架。
Volley 也有缺陷,比如不支持 post 大數(shù)據(jù),所以不適合上傳文件。不過 Volley 設(shè)計的初衷本身也就是為頻繁的、數(shù)據(jù)量小的網(wǎng)絡(luò)請求而生!
關(guān)于 Volley 的具體用法可以見我很早在 GitHub 的一個 demo :
https://github.com/stormzhang/AndroidVolley
3. Retrofit
Retrofit 是 Square 公司出品的默認(rèn)基于 OkHttp 封裝的一套 RESTful 網(wǎng)絡(luò)請求框架,不了解 RESTful 概念的不妨去搜索學(xué)習(xí)下,RESTful 可以說是目前流行的一套 api 設(shè)計的風(fēng)格,并不是標(biāo)準(zhǔn)。Retrofit 的封裝可以說是很強(qiáng)大,里面涉及到一堆的設(shè)計模式,你可以通過注解直接配置請求,你可以使用不同的 http 客戶端,雖然默認(rèn)是用 http ,可以使用不同 Json Converter 來序列化數(shù)據(jù),同時提供對 RxJava 的支持,使用 Retrofit + OkHttp + RxJava + Dagger2 可以說是目前比較潮的一套框架,但是需要有比較高的門檻。
Retrofit 的具體使用方法與地址在這里:
http://square.github.io/retrofit/
4. Volley VS OkHttp
毫無疑問 Volley 的優(yōu)勢在于封裝的更好,而使用 OkHttp 你需要有足夠的能力再進(jìn)行一次封裝。而 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 ,這點(diǎn) OkHttp 的性能優(yōu)勢就沒了,而且 Volley 本身封裝的也更易用,擴(kuò)展性更好些。
5. OkHttp VS Retrofit
毫無疑問,Retrofit 默認(rèn)是基于 OkHttp 而做的封裝,這點(diǎn)來說沒有可比性,肯定首選 Retrofit。
6. Volley VS Retrofit
這兩個庫都做了非常不錯的封裝,但是 Retrofit 解耦的更徹底,尤其 Retrofit 2.0 出來,Jake 對之前 1.0 設(shè)計不合理的地方做了大量重構(gòu),職責(zé)更細(xì)分,而且 Retrofit 默認(rèn)使用 OkHttp ,性能上也要比 Volley 占優(yōu)勢,再有如果你的項目如果采用了 RxJava ,那更該使用 Retrofit 。
所以說這兩個庫相比,Retrofit 毫無疑問更有優(yōu)勢,你在能掌握兩個框架的前提下該優(yōu)先使用 Retrofit。但是個人認(rèn)為 Retrofit 門檻要比 Volley 稍高些,你要理解他的原理,各種用法,想徹底搞明白還是需要花些功夫的,如果你對它一知半解,那還是建議在商業(yè)項目使用 Volley 吧。
7. 總結(jié)
所以綜上,如果以上三種網(wǎng)絡(luò)庫你都能熟練掌握,那么優(yōu)先推薦使用 Retrofit ,前提是最好你們的后臺 api 也能遵循 RESTful 的風(fēng)格,其次如果你不想使用或者沒能力掌握 Retrofit ,那么推薦使用 Volley ,畢竟 Volley 你不需要做過多的封裝,當(dāng)然如果你們需要上傳大數(shù)據(jù),那么不建議使用 Volley,否則你該采用 OkHttp 。
最后,我知道可能有些人會糾結(jié) Volley 與 OkHttp 的選擇,那是因為我認(rèn)為 OkHttp 還是需要一定的能力做一層封裝的,如果你有能力封裝的話那不如直接用 Retrofit 了,如果沒能力封裝還是乖乖的用 Volley 吧,如果你能有一些不錯的基于 OkHttp 封裝好的開源庫,那么另說了,Volley 與 OkHttp 怎么選擇隨你便唄。
原文鏈接:https://www.zhihu.com/question/35189851/answer/115680683