Android主流常用網(wǎng)絡(luò)請求框架簡介

一、Volley

google推出的異步網(wǎng)絡(luò)請求框架和圖片加載框架。特別適合數(shù)據(jù)量小呈枉,通信頻繁的網(wǎng)絡(luò)操作。android絕大多數(shù)都屬于這種類型埃碱,但是對于數(shù)據(jù)量比較大的操作,比如:下載酥泞,就不太適用了砚殿。

來源: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握手失敗問題染坯。

張洪祥版 有實現(xiàn)整合Gson

完整的封裝地址:?https://github.com/hongyangAndroid/okhttp-utils

使用手冊 :http://blog.csdn.net/lmj623565791/article/details/47911083

如何選擇均芽?

1. 原則

本篇說的網(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ū)別枉氮。

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 公司出品的默認(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/

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 默認(rèn)是基于 OkHttp 而做的封裝,這點來說沒有可比性暇韧,肯定首選 Retrofit勾习。

7. 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 吧。

8. 總結(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 怎么選擇隨你便唄掉丽。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市给赞,隨后出現(xiàn)的幾起案子机打,更是在濱河造成了極大的恐慌,老刑警劉巖片迅,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件残邀,死亡現(xiàn)場離奇詭異,居然都是意外死亡柑蛇,警方通過查閱死者的電腦和手機芥挣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耻台,“玉大人空免,你說我怎么就攤上這事∨璧ⅲ” “怎么了蹋砚?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長摄杂。 經(jīng)常有香客問我坝咐,道長,這世上最難降的妖魔是什么析恢? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任墨坚,我火速辦了婚禮,結(jié)果婚禮上映挂,老公的妹妹穿的比我還像新娘泽篮。我一直安慰自己,他們只是感情好柑船,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布帽撑。 她就那樣靜靜地躺著,像睡著了一般鞍时。 火紅的嫁衣襯著肌膚如雪亏拉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音专筷,去河邊找鬼弱贼。 笑死,一個胖子當(dāng)著我的面吹牛磷蛹,可吹牛的內(nèi)容都是我干的吮旅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼味咳,長吁一口氣:“原來是場噩夢啊……” “哼庇勃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起槽驶,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤责嚷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后掂铐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罕拂,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年全陨,在試婚紗的時候發(fā)現(xiàn)自己被綠了爆班。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡辱姨,死狀恐怖柿菩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雨涛,我是刑警寧澤枢舶,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站替久,受9級特大地震影響凉泄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侣肄,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一旧困、第九天 我趴在偏房一處隱蔽的房頂上張望醇份。 院中可真熱鬧稼锅,春花似錦、人聲如沸僚纷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怖竭。三九已至锥债,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背哮肚。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工登夫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人允趟。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓恼策,卻偏偏與公主長得像,于是被迫代替她去往敵國和親潮剪。 傳聞我的和親對象是個殘疾皇子涣楷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容