網(wǎng)絡(luò)請(qǐng)求庫(kù)分析比較

標(biāo)簽(空格分隔): Android


我們來(lái)先說(shuō)一個(gè)常識(shí)性的錯(cuò)誤:

volley, retrofit, android-async-http 幫你封裝了具體的請(qǐng)求滤祖,線程切換以及數(shù)據(jù)轉(zhuǎn)換。他們是網(wǎng)絡(luò)底層實(shí)現(xiàn)庫(kù)的封裝庫(kù)

而OkHttp 是基于http協(xié)議封裝的一套請(qǐng)求客戶端瓶籽,雖然它也可以開(kāi)線程匠童,但根本上它更偏向真正的請(qǐng)求,跟HttpClient,HttpUrlConnection的職責(zé)是一樣的塑顺。所以不要混淆

網(wǎng)絡(luò)底層的實(shí)現(xiàn)庫(kù):
HttpURLConnection:是Java中的標(biāo)準(zhǔn)類汤求,是對(duì)Java中socket的封裝。
Httpclient:是Apache的開(kāi)源框架严拒,是對(duì)HttpURLConnection的封裝。
Okhttp:是Square公司開(kāi)發(fā)的開(kāi)源網(wǎng)絡(luò)訪問(wèn)框架,是對(duì)socket的封裝重父。


以下是Stay的見(jiàn)解:
作者:Stay Zhang
鏈接:https://www.zhihu.com/question/35189851/answer/93973482
來(lái)源:知乎
著作權(quán)歸作者所有泥张。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處种蘸。

首先墓赴,我想即使你單純使用OkHttp,還是會(huì)再包一層的航瞭,這樣就等價(jià)于Volley之流的框架诫硕,只是封裝的好與壞而已。

android-async-http內(nèi)部實(shí)現(xiàn)是基于HttpClient, 想必你肯定知道6.0之后HttpClient是不是系統(tǒng)自帶的了刊侯,不過(guò)它在最近的更新中將HttpClient的所有代碼copy了一份進(jìn)來(lái)痘括,所以還能使用。

Volley是官方出的滔吠,volley在設(shè)計(jì)的時(shí)候是將具體的請(qǐng)求客戶端做了下封裝:HurlStack纲菌,也就是說(shuō)可以支持HttpUrlConnection, HttpClient, OkHttp,相當(dāng)于模版模式吧疮绷,這樣解耦還是非常方便的翰舌,可以隨意切換,如果你之前使用過(guò)Volley冬骚,并習(xí)慣使用椅贱,那直接寫(xiě)個(gè)OkHttp擴(kuò)展就行了懂算。

Retrofit因?yàn)橐彩莝quare出的,所以大家可能對(duì)它更崇拜些庇麦。Retrofit的跟Volley是一個(gè)套路计技,但解耦的更徹底:比方說(shuō)通過(guò)注解來(lái)配置請(qǐng)求參數(shù),通過(guò)工廠來(lái)生成CallAdapter山橄,Converter垮媒,你可以使用不同的請(qǐng)求適配器(CallAdapter), 比方說(shuō)RxJava,Java8, Guava航棱。你可以使用不同的反序列化工具(Converter)睡雇,比方說(shuō)json, protobuff, xml, moshi等等。

炒雞解耦饮醇,里面涉及到超多設(shè)計(jì)模式它抱,個(gè)人覺(jué)得是很經(jīng)典的學(xué)習(xí)案例。雖然支持Java8朴艰, Guava你可能也不需要用到观蓄。xml,protobuff等數(shù)據(jù)格式你也可能不需要解析祠墅。but蜘腌,萬(wàn)一遇到鬼了呢。
至于性能上饵隙,個(gè)人覺(jué)得這完全取決于請(qǐng)求client撮珠,也就是okhttp的性能,跟這些封裝工具沒(méi)太大關(guān)系金矛。

至于RxJava芯急,最好充分理解其原理之后再使用,別人云亦云驶俊,特別team人數(shù)多的情況下娶耍,總得有個(gè)完全精通的吧,萬(wàn)一掉坑里了呢饼酿。榕酒。。

就說(shuō)這么多啦故俐,選最適合項(xiàng)目的想鹰,選大多數(shù)人選擇的,選簡(jiǎn)單易用的药版,就這么個(gè)標(biāo)準(zhǔn)辑舷。


一篇較好的分析文章鏈接

一片綜合性很強(qiáng)的文章,包括Http原理槽片,各個(gè)網(wǎng)絡(luò)庫(kù)比較何缓,圖片庫(kù)比較肢础,圖床

總結(jié)

終于到了總結(jié)的時(shí)候了,一般來(lái)說(shuō)碌廓,這都是干貨的時(shí)候传轰,哈哈~

Volley對(duì)比優(yōu)勢(shì)
1.緩存處理;Volley自己就提供了一套完整的緩存處理方案谷婆,默認(rèn)使用文件存儲(chǔ)到磁盤(pán)中慨蛙,并且提供了TTL SOFTTTL這么體貼入微的機(jī)制;一個(gè)Request可能存在兩個(gè)Response,對(duì)于需要顯示緩存波材,再顯示網(wǎng)絡(luò)數(shù)據(jù)的場(chǎng)景真是爽的不要不要的股淡。而Retrofit中并沒(méi)有提供任何和緩存相關(guān)的方案身隐。
2.代碼簡(jiǎn)單廷区,可讀性高。Volley的代碼是寫(xiě)的如此的直接了當(dāng)贾铝,讓你看起代碼來(lái)都不需要喝口茶隙轻,這樣的好處是我們我們需要修改代碼時(shí)不太容易引入bug....囧
3.同一個(gè)請(qǐng)求如果同時(shí)都在發(fā)送,那么實(shí)際上只會(huì)有一個(gè)請(qǐng)求真正發(fā)出去垢揩, 其它的請(qǐng)求會(huì)等待這個(gè)結(jié)果回來(lái)玖绿,算小小優(yōu)化吧。實(shí)際上這種場(chǎng)景不是很多哈叁巨,如果有斑匪,可能是你代碼有問(wèn)題...
4.請(qǐng)求發(fā)送的時(shí)候提供了優(yōu)先級(jí)的概念,但是是只保證順序出去锋勺,不保證順序回來(lái)蚀瘸,然并卵。
5.支持不同的Http客戶端實(shí)現(xiàn)庶橱,默認(rèn)提供了HttpClient和HttpUrlConnection的實(shí)現(xiàn)贮勃,而Retrofit在2.0版本之后,鎖死在OkHttp上了苏章。
6.支持請(qǐng)求取消

Retrofit對(duì)比優(yōu)勢(shì)
1.發(fā)送請(qǐng)求真簡(jiǎn)單寂嘉,定義一個(gè)方法就可以了,這么簡(jiǎn)單的請(qǐng)求框架還有誰(shuí)枫绅?Volley?
2.較好的可擴(kuò)展性泉孩,Volley中每一個(gè)新建一個(gè)Request時(shí)都需要指定一個(gè)父類,告知序列化數(shù)據(jù)的方式并淋,而Retrofit中只需要在配置時(shí)棵譬,指定各種轉(zhuǎn)換器即可。CallAdapter的存在预伺,可以使你隨意代理調(diào)用的Call订咸,不錯(cuò)不錯(cuò)曼尊。。脏嚷。
3.OkHttpClient自帶并發(fā)光環(huán)骆撇,而Volley中的工作線程是自己維護(hù)的,那么就有可能存在線程由于異常退出之后父叙,沒(méi)有下一個(gè)工作線程補(bǔ)充的風(fēng)險(xiǎn)(線程池可以彌補(bǔ)這個(gè)缺陷)神郊,這在Retrofit中不存在,因?yàn)榧词褂袉?wèn)題趾唱,這個(gè)鍋也會(huì)甩給OkHttp涌乳,嘿嘿
4.支持請(qǐng)求取消

再次說(shuō)明的是,Retrofit沒(méi)有對(duì)緩存提供任何額外支持甜癞,也就是說(shuō)它只能通過(guò)HTTP的Cache control做文件存儲(chǔ)夕晓,這樣就會(huì)有一些問(wèn)題:
1.需要Server通過(guò)Cache control頭部來(lái)控制緩存,需要修改后臺(tái)代碼
2.有些地方比較適合使用數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)悠咱,比如關(guān)系存儲(chǔ)蒸辆,此時(shí),Retrofit就無(wú)能為力了
3.緩存不在我們的控制范圍之內(nèi)析既,而是完全通過(guò)OkHttp來(lái)管理躬贡,多少有些不便,比如我們要?jiǎng)h除某一個(gè)指定的緩存眼坏,或者更新某一個(gè)指定緩存拂玻,代碼寫(xiě)起來(lái)很別扭(自己hack請(qǐng)求頭里面的cache contrl)

而在我們項(xiàng)目的實(shí)際使用過(guò)程中,緩存是一個(gè)比較重要的角色宰译,Retrofit對(duì)緩存的支持度不是很好檐蚜,真是讓人傷心。囤屹。熬甚。
但是,我們還是覺(jué)得在使用中Retrofit真心比較方便肋坚,容易上手乡括,通過(guò)注解代碼可讀性和可維護(hù)性提升了N個(gè)檔次,幾乎沒(méi)有樣板代碼(好吧智厌,如果你覺(jué)得每個(gè)請(qǐng)求都需要定義一個(gè)方法诲泌,那這也算。铣鹏。)敷扫,所以最后的決定是選擇Retrofit。

有人說(shuō)了,Volley中的兩次響應(yīng)和緩存用起來(lái)很happy怎么辦葵第?嗯绘迁,我們會(huì)修改Retrofit,使它支持文件存儲(chǔ)和ORM存儲(chǔ)卒密,并將Volley的緩存 網(wǎng)絡(luò)兩次響應(yīng)回調(diào)移接過(guò)來(lái)缀台,這個(gè)項(xiàng)目正在測(cè)試階段,待我們項(xiàng)目做完小白鼠哮奇,上線穩(wěn)定之后膛腐,我會(huì)把代碼開(kāi)源,大家敬請(qǐng)關(guān)注鼎俘。

文/楚云之南(簡(jiǎn)書(shū)作者)
原文鏈接:http://www.reibang.com/p/07dac989272c
著作權(quán)歸作者所有哲身,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),并標(biāo)注“簡(jiǎn)書(shū)作者”贸伐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末勘天,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子棍丐,更是在濱河造成了極大的恐慌误辑,老刑警劉巖沧踏,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歌逢,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡翘狱,警方通過(guò)查閱死者的電腦和手機(jī)秘案,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)潦匈,“玉大人阱高,你說(shuō)我怎么就攤上這事〔缢酰” “怎么了赤惊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)凰锡。 經(jīng)常有香客問(wèn)我未舟,道長(zhǎng),這世上最難降的妖魔是什么掂为? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任裕膀,我火速辦了婚禮,結(jié)果婚禮上勇哗,老公的妹妹穿的比我還像新娘昼扛。我一直安慰自己,他們只是感情好欲诺,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布抄谐。 她就那樣靜靜地躺著渺鹦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛹含。 梳的紋絲不亂的頭發(fā)上海铆,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音挣惰,去河邊找鬼卧斟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛憎茂,可吹牛的內(nèi)容都是我干的珍语。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼竖幔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼板乙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起拳氢,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤募逞,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后馋评,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體放接,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年留特,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纠脾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜕青,死狀恐怖苟蹈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情右核,我是刑警寧澤慧脱,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站贺喝,受9級(jí)特大地震影響菱鸥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜搜变,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一采缚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挠他,春花似錦扳抽、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)镰烧。三九已至,卻和暖如春楞陷,著一層夾襖步出監(jiān)牢的瞬間怔鳖,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工固蛾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留结执,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓艾凯,卻偏偏與公主長(zhǎng)得像献幔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子趾诗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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