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

一、Volley

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

來(lái)源:http://a.codekk.com/detail/Android/grumoon/Volley%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90

1.Volley主要特點(diǎn)

1.擴(kuò)展性強(qiáng)? ? ? ? ? 基于接口設(shè)計(jì)。2.一定程度上符合http規(guī)范。? ? ? ? 返回包括ResponseCode 的處理,請(qǐng)求頭的處理,緩存機(jī)制的支持。3.重試以及優(yōu)先級(jí)的定義。4.2.3以上基于HttpUrlconnection。2.3以下是Httpclient(沒(méi)有這號(hào)機(jī)子了吧)5.提供簡(jiǎn)單的圖片加載工具。

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問(wèn)題收錄:

Volley的request默認(rèn)回調(diào)到主線程中,如果有需求是要加載到sqlite等等仍需要在子線程中進(jìn)行的操作 解決方案 :https://www.zhihu.com/question/36672622/answer/76003423


二、Retrofit

Retrofit 基于注解,提供JSON to POJO(Plain Ordinary Java Object,簡(jiǎn)單Java對(duì)象),POJO to JSON,網(wǎng)絡(luò)請(qǐng)求(POST,GET,PUT,DELETE等)封裝。

三、OkHttp

這個(gè)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)

主要用于查看請(qǐng)求信息及返回信息,如鏈接地址、頭信息、參數(shù)信息等

2)網(wǎng)絡(luò)攔截器(Network Interceptors)

可以添加、刪除或替換請(qǐng)求頭信息,還可以改變的請(qǐng)求攜帶的實(shí)體。

緩存的使用方式>http://blog.csdn.net/copy_yuan/article/details/51524907

noCache :不使用緩存,全部走網(wǎng)絡(luò) noStore : 不使用緩存,也不存儲(chǔ)緩存 onlyIfCached : 只使用緩存 maxAge :設(shè)置最大失效時(shí)間,失效則不使用 maxStale :設(shè)置最大失效時(shí)間,失效則不使用 minFresh :設(shè)置最小有效時(shí)間,失效則不使用 FORCE_NETWORK : 強(qiáng)制走網(wǎng)絡(luò) FORCE_CACHE:強(qiáng)制走緩存

一般的get、post、基于http文件上傳、文件下載、加載圖片、支持請(qǐng)求回調(diào)、直接返回對(duì)象、對(duì)象集合、支持session的保持。

會(huì)從很多常用的連接問(wèn)題中自動(dòng)恢復(fù)。如果您的服務(wù)器配置了多個(gè)IP地址,當(dāng)?shù)谝粋€(gè)IP連接失敗的時(shí)候,OkHttp會(huì)自動(dòng)嘗試下一個(gè)IP。OkHttp還處理了代理服務(wù)器問(wèn)題和SSL握手失敗問(wèn)題。

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

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

使用手冊(cè) :http://blog.csdn.net/lmj623565791/article/details/47911083

如何選擇?

1. 原則

本篇說(shuō)的網(wǎng)絡(luò)請(qǐng)求專指 http 請(qǐng)求,在選擇一個(gè)框架之前,我個(gè)人有個(gè)習(xí)慣,就是我喜歡選擇專注的庫(kù),其實(shí)在軟件設(shè)計(jì)領(lǐng)域有一個(gè)原則叫做 「單一職責(zé)原則」,跟我所說(shuō)的「專注」不謀而合,一個(gè)庫(kù)能把一件事做好就很不錯(cuò)了?,F(xiàn)如今有很多大而全的庫(kù),比如這個(gè)庫(kù)可以網(wǎng)絡(luò)請(qǐng)求,同時(shí)又可以圖片加載,又可以數(shù)據(jù)存儲(chǔ),又可以 View 注解等等,我們使用這種庫(kù)當(dāng)然方便了,但是你有沒(méi)有想過(guò)?這樣會(huì)使得你整個(gè)項(xiàng)目對(duì)它依賴性太強(qiáng),萬(wàn)一以后這個(gè)庫(kù)不維護(hù)了,或者中間某個(gè)模塊出問(wèn)題了,這個(gè)影響非常大,而且我一直認(rèn)為大而全的框架可能某一塊都做的不夠好,所以我在選擇的時(shí)候更喜歡專注某一領(lǐng)域的框架。

在上面原則的基礎(chǔ)上,所以目前來(lái)說(shuō)單純的網(wǎng)絡(luò)請(qǐng)求庫(kù)就鎖定在了 Volley、OkHttp、Retrofit 三個(gè),android-async-http 的作者已經(jīng)不維護(hù),所以這里就不多說(shuō)了,下面我們分別來(lái)說(shuō)說(shuō)這三個(gè)庫(kù)的區(qū)別。

2. OkHttp

我們知道在 Android 開(kāi)發(fā)中是可以直接使用現(xiàn)成的 api 進(jìn)行網(wǎng)絡(luò)請(qǐng)求的,就是使用 HttpClient、HttpUrlConnection 進(jìn)行操作,目前 HttpClient 已經(jīng)被廢棄,而 android-async-http 是基于 HttpClient 的,我想可能也是因?yàn)檫@個(gè)原因作者放棄維護(hù)。

而 OkHttp 是 Square 公司開(kāi)源的針對(duì) Java 和 Android 程序,封裝的一個(gè)高性能 http 請(qǐng)求庫(kù),所以它的職責(zé)跟 HttpUrlConnection 是一樣的,支持 spdy、http 2.0、websocket ,支持同步、異步,而且 OkHttp 又封裝了線程池,封裝了數(shù)據(jù)轉(zhuǎn)換,封裝了參數(shù)使用、錯(cuò)誤處理等,api 使用起來(lái)更加方便??梢园阉斫獬墒且粋€(gè)封裝之后的類似 HttpUrlConnection 的一個(gè)東西,但是你在使用的時(shí)候仍然需要自己再做一層封裝,這樣才能像使用一個(gè)框架一樣更加順手。

OkHttp 的具體使用方法這里就不贅述,地址在這里:

http://square.github.io/okhttp/

3. Volley

Volley 是 Google 官方出的一套小而巧的異步請(qǐng)求庫(kù),該框架封裝的擴(kuò)展性很強(qiáng),支持 HttpClient、HttpUrlConnection,甚至支持 OkHttp,具體方法可以看 Jake 大神的這個(gè) Gist 文件:

https://gist.github.com/JakeWharton/5616899

而且 Volley 里面也封裝了 ImageLoader ,所以如果你愿意你甚至不需要使用圖片加載框架,不過(guò)這塊功能沒(méi)有一些專門(mén)的圖片加載框架強(qiáng)大,對(duì)于簡(jiǎn)單的需求可以使用,對(duì)于稍復(fù)雜點(diǎn)的需求還是需要用到專門(mén)的圖片加載框架。

Volley 也有缺陷,比如不支持 post 大數(shù)據(jù),所以不適合上傳文件。不過(guò) Volley 設(shè)計(jì)的初衷本身也就是為頻繁的、數(shù)據(jù)量小的網(wǎng)絡(luò)請(qǐng)求而生!

關(guān)于 Volley 的具體用法可以見(jiàn)我很早在 GitHub 的一個(gè) demo :

https://github.com/stormzhang/AndroidVolley

4. Retrofit

Retrofit 是 Square 公司出品的默認(rèn)基于 OkHttp 封裝的一套 RESTful 網(wǎng)絡(luò)請(qǐng)求框架,不了解 RESTful 概念的不妨去搜索學(xué)習(xí)下,RESTful 可以說(shuō)是目前流行的一套 api 設(shè)計(jì)的風(fēng)格,并不是標(biāo)準(zhǔn)。Retrofit 的封裝可以說(shuō)是很強(qiáng)大,里面涉及到一堆的設(shè)計(jì)模式,你可以通過(guò)注解直接配置請(qǐng)求,你可以使用不同的 http 客戶端,雖然默認(rèn)是用 http ,可以使用不同 Json Converter 來(lái)序列化數(shù)據(jù),同時(shí)提供對(duì) RxJava 的支持,使用 Retrofit + OkHttp + RxJava + Dagger2 可以說(shuō)是目前比較潮的一套框架,但是需要有比較高的門(mén)檻。

Retrofit 的具體使用方法與地址在這里:

http://square.github.io/retrofit/

5. Volley VS OkHttp

毫無(wú)疑問(wèn) Volley 的優(yōu)勢(shì)在于封裝的更好,而使用 OkHttp 你需要有足夠的能力再進(jìn)行一次封裝。而 OkHttp 的優(yōu)勢(shì)在于性能更高,因?yàn)?OkHttp 基于 NIO 和 Okio ,所以性能上要比 Volley更快。

估計(jì)有些讀者不理解 IO 和 NIO 的概念,這里姑且簡(jiǎn)單提下,這兩個(gè)都是 Java 中的概念,如果我從硬盤(pán)讀取數(shù)據(jù),第一種方式就是程序一直等,數(shù)據(jù)讀完后才能繼續(xù)操作,這種是最簡(jiǎn)單的也叫阻塞式 IO,還有一種就是你讀你的,我程序接著往下執(zhí)行,等數(shù)據(jù)處理完你再來(lái)通知我,然后再處理回調(diào)。而第二種就是 NIO 的方式,非阻塞式。

所以 NIO 當(dāng)然要比 IO 的性能要好了, 而 Okio 是 Square 公司基于 IO 和 NIO 基礎(chǔ)上做的一個(gè)更簡(jiǎn)單、高效處理數(shù)據(jù)流的一個(gè)庫(kù)。

理論上如果 Volley 和 OkHttp 對(duì)比的話,我更傾向于使用 Volley,因?yàn)?Volley 內(nèi)部同樣支持使用 OkHttp ,這點(diǎn) OkHttp 的性能優(yōu)勢(shì)就沒(méi)了,而且 Volley 本身封裝的也更易用,擴(kuò)展性更好些。

6. OkHttp VS Retrofit

毫無(wú)疑問(wèn),Retrofit 默認(rèn)是基于 OkHttp 而做的封裝,這點(diǎn)來(lái)說(shuō)沒(méi)有可比性,肯定首選 Retrofit。

7. Volley VS Retrofit

這兩個(gè)庫(kù)都做了非常不錯(cuò)的封裝,但是 Retrofit 解耦的更徹底,尤其 Retrofit 2.0 出來(lái),Jake 對(duì)之前 1.0 設(shè)計(jì)不合理的地方做了大量重構(gòu),職責(zé)更細(xì)分,而且 Retrofit 默認(rèn)使用 OkHttp ,性能上也要比 Volley 占優(yōu)勢(shì),再有如果你的項(xiàng)目如果采用了 RxJava ,那更該使用 Retrofit 。

所以說(shuō)這兩個(gè)庫(kù)相比,Retrofit 毫無(wú)疑問(wèn)更有優(yōu)勢(shì),你在能掌握兩個(gè)框架的前提下該優(yōu)先使用 Retrofit。但是個(gè)人認(rèn)為 Retrofit 門(mén)檻要比 Volley 稍高些,你要理解他的原理,各種用法,想徹底搞明白還是需要花些功夫的,如果你對(duì)它一知半解,那還是建議在商業(yè)項(xiàng)目使用 Volley 吧。

8. 總結(jié)

所以綜上,如果以上三種網(wǎng)絡(luò)庫(kù)你都能熟練掌握,那么優(yōu)先推薦使用 Retrofit ,前提是最好你們的后臺(tái) api 也能遵循 RESTful 的風(fēng)格,其次如果你不想使用或者沒(méi)能力掌握 Retrofit ,那么推薦使用 Volley ,畢竟 Volley 你不需要做過(guò)多的封裝,當(dāng)然如果你們需要上傳大數(shù)據(jù),那么不建議使用 Volley,否則你該采用 OkHttp 。

最后,我知道可能有些人會(huì)糾結(jié) Volley 與 OkHttp 的選擇,那是因?yàn)槲艺J(rèn)為 OkHttp 還是需要一定的能力做一層封裝的,如果你有能力封裝的話那不如直接用 Retrofit 了,如果沒(méi)能力封裝還是乖乖的用 Volley 吧,如果你能有一些不錯(cuò)的基于 OkHttp 封裝好的開(kāi)源庫(kù),那么另說(shuō)了,Volley 與 OkHttp 怎么選擇隨你便唄。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容