一、Volley
來源:http://a.codekk.com/detail/Android/grumoon/Volley%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90
1.Volley主要特點
1.擴展性強? ? ? ? ? 基于接口設(shè)計。2.一定程度上符合http規(guī)范芝囤。? ? ? ? 返回包括ResponseCode 的處理似炎,請求頭的處理,緩存機制的支持悯姊。3.重試以及優(yōu)先級的定義羡藐。4.2.3以上基于HttpUrlconnection。2.3以下是Httpclient(沒有這號機子了吧)5.提供簡單的圖片加載工具悯许。
2.Volley的使用
?郭霖講解:http://blog.csdn.net/sinyu890807/article/details/17482095
基本的使用方法:?http://www.kwstu.com/ArticleView/kwstu_20144118313429
直接返回Object的話仆嗦,用Gson/FastJson與Volley的結(jié)合:http://www.cnblogs.com/freexiaoyu/p/3955137.html
3.Volley問題收錄:
Volley的request默認(rèn)回調(diào)到主線程中,如果有需求是要加載到sqlite等等仍需要在子線程中進行的操作 解決方案 :https://www.zhihu.com/question/36672622/answer/76003423
二先壕、Retrofit
Retrofit 基于注解瘩扼,提供JSON to POJO(Plain Ordinary Java Object,簡單Java對象),POJO to JSON垃僚,網(wǎng)絡(luò)請求(POST集绰,GET,PUT,DELETE等)封裝谆棺。
三栽燕、OkHttp
這個onResponse執(zhí)行的線程并不是UI線程。
OKHttp源碼位置?https://github.com/square/okhttp
泡網(wǎng)的源碼分析:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0326/2643.html
Interceptor 云端響應(yīng)攔截器改淑, 設(shè)置緩存策略
1)應(yīng)用攔截器(ApplicationInterceptors)
主要用于查看請求信息及返回信息碍岔,如鏈接地址、頭信息朵夏、參數(shù)信息等
2)網(wǎng)絡(luò)攔截器(Network Interceptors)
可以添加付秕、刪除或替換請求頭信息,還可以改變的請求攜帶的實體侍郭。
緩存的使用方式>http://blog.csdn.net/copy_yuan/article/details/51524907
noCache :不使用緩存询吴,全部走網(wǎng)絡(luò) noStore : 不使用緩存掠河,也不存儲緩存 onlyIfCached : 只使用緩存 maxAge :設(shè)置最大失效時間,失效則不使用 maxStale :設(shè)置最大失效時間猛计,失效則不使用 minFresh :設(shè)置最小有效時間唠摹,失效則不使用 FORCE_NETWORK : 強制走網(wǎng)絡(luò) FORCE_CACHE:強制走緩存
一般的get、post奉瘤、基于http文件上傳勾拉、文件下載、加載圖片盗温、支持請求回調(diào)藕赞、直接返回對象、對象集合卖局、支持session的保持斧蜕。
會從很多常用的連接問題中自動恢復(fù)。如果您的服務(wù)器配置了多個IP地址砚偶,當(dāng)?shù)谝粋€IP連接失敗的時候批销,OkHttp會自動嘗試下一個IP。OkHttp還處理了代理服務(wù)器問題和SSL握手失敗問題染坯。
完整的封裝地址:?https://github.com/hongyangAndroid/okhttp-utils
使用手冊 :http://blog.csdn.net/lmj623565791/article/details/47911083
如何選擇均芽?
本篇說的網(wǎng)絡(luò)請求專指 http 請求,在選擇一個框架之前单鹿,我個人有個習(xí)慣掀宋,就是我喜歡選擇專注的庫,其實在軟件設(shè)計領(lǐng)域有一個原則叫做 「單一職責(zé)原則」仲锄,跟我所說的「專注」不謀而合布朦,一個庫能把一件事做好就很不錯了。現(xiàn)如今有很多大而全的庫昼窗,比如這個庫可以網(wǎng)絡(luò)請求是趴,同時又可以圖片加載,又可以數(shù)據(jù)存儲澄惊,又可以 View 注解等等唆途,我們使用這種庫當(dāng)然方便了,但是你有沒有想過掸驱?這樣會使得你整個項目對它依賴性太強肛搬,萬一以后這個庫不維護了,或者中間某個模塊出問題了毕贼,這個影響非常大温赔,而且我一直認(rèn)為大而全的框架可能某一塊都做的不夠好,所以我在選擇的時候更喜歡專注某一領(lǐng)域的框架鬼癣。
在上面原則的基礎(chǔ)上陶贼,所以目前來說單純的網(wǎng)絡(luò)請求庫就鎖定在了 Volley啤贩、OkHttp、Retrofit 三個拜秧,android-async-http 的作者已經(jīng)不維護痹屹,所以這里就不多說了,下面我們分別來說說這三個庫的區(qū)別枉氮。
我們知道在 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/
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
Retrofit 是 Square 公司出品的默認(rèn)基于 OkHttp 封裝的一套 RESTful 網(wǎng)絡(luò)請求框架吊说,不了解 RESTful 概念的不妨去搜索學(xué)習(xí)下,RESTful 可以說是目前流行的一套 api 設(shè)計的風(fēng)格优炬,并不是標(biāo)準(zhǔn)颁井。Retrofit 的封裝可以說是很強大,里面涉及到一堆的設(shè)計模式蠢护,你可以通過注解直接配置請求雅宾,你可以使用不同的 http 客戶端,雖然默認(rèn)是用 http 葵硕,可以使用不同 Json Converter 來序列化數(shù)據(jù)眉抬,同時提供對 RxJava 的支持,使用 Retrofit + OkHttp + RxJava + Dagger2 可以說是目前比較潮的一套框架懈凹,但是需要有比較高的門檻蜀变。
Retrofit 的具體使用方法與地址在這里:
http://square.github.io/retrofit/
毫無疑問 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 本身封裝的也更易用,擴展性更好些弓乙。
毫無疑問末融,Retrofit 默認(rèn)是基于 OkHttp 而做的封裝,這點來說沒有可比性暇韧,肯定首選 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 吧。
所以綜上般此,如果以上三種網(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 怎么選擇隨你便唄掉丽。