標(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ū)作者”贸伐。