okhttp,retrofit,android-async-http,volley應該選擇哪一個?

okhttp,
retrofit,
android-async-http,
volley
這四個框架適用的場合?優缺點?
請給一些建議.我準備開發一個新的APP。


  • 個人比較推薦Square開源組合,用Retrofit(目前已經是2.0+)+OkHttp基本上已經可以處理任何業務場景了,Square開源庫質量還是值得信賴的。

Retrofit的特點我個人認為是簡化了網路請求流程,同時自己內部對OkHtttp客戶端做了封裝,同時2.x把之前1.x版本的部分不恰當職責都轉移給OkHttp了(例如Log,目前用OkHttp的Interceptor來實現),這樣的好處是職責清晰,Retrofit做自己該做的事兒。

而且Retrofit提供不同的Json Converter實現(也可以自定義),同時提供RxJava支持(返回Observable對象),配合Jackson(或者Gson)和RxJava,再加上Dagger2,你的效率至少可以提高一倍。

參見我之前的回答:OkHttp在安卓中的使用? - 知乎用戶的回答

  • 目前我所在的公司的技術棧沒用到Volley和android-async-http,如果要用的話,估計還是要做一下二次封裝的。
  • 同時推薦用最新的Android Flux來架構你的Android程序,Facebook提出的架構,文檔比較全,數據流總是單向的,飛。用過MVC,MVP,我還是是比較認同Flux的,而且之前公司用的架構模式跟Flux也比較像。

推薦一篇入門博客:AndroidFlux入門


我們來先說一個常識性的錯誤:


volley, retrofit, android-async-http 幫你封裝了具體的請求,線程切換以及數據轉換。


而OkHttp 是基於http協議封裝的一套請求客戶端,雖然它也可以開線程,但根本上它更偏向真正的請求,跟HttpClient, HttpUrlConnection的職責是一樣的。


所以不要混淆。


-----以下純個人主觀見解


首先,我想即使你單純使用OkHttp,還是會再包一層的,這樣就等價於Volley之流的框架,只是封裝的好與壞而已。


android-async-http內部實現是基於HttpClient, 想必你肯定知道6.0之後HttpClient是不是系統自帶的了,不過它在最近的更新中將HttpClient的所有代碼copy了一份進來,所以還能使用。


Volley是官方出的,volley在設計的時候是將具體的請求客戶端做了下封裝:HurlStack,也就是說可以支持HttpUrlConnection, HttpClient, OkHttp,相當於模版模式吧,這樣解耦還是非常方便的,可以隨意切換,如果你之前使用過Volley,並習慣使用,那直接寫個OkHttp擴展就行了。


Retrofit因為也是square出的,所以大家可能對它更崇拜些。Retrofit的跟Volley是一個套路,但解耦的更徹底:比方說通過註解來配置請求參數,通過工廠來生成CallAdapter,Converter,你可以使用不同的請求適配器(CallAdapter), 比方說RxJava,Java8, Guava。你可以使用不同的反序列化工具(Converter),比方說json, protobuff, xml, moshi等等。


炒雞解耦,裡面涉及到超多設計模式,個人覺得是很經典的學習案例。雖然支持Java8, Guava你可能也不需要用到。xml,protobuff等數據格式你也可能不需要解析。but,萬一遇到鬼了呢。

至於性能上,個人覺得這完全取決於請求client,也就是okhttp的性能,跟這些封裝工具沒太大關係。


至於RxJava,最好充分理解其原理之後再使用,別人云亦云,特別team人數多的情況下,總得有個完全精通的吧,萬一掉坑裡了呢。。。


就說這麼多啦,選最適合項目的,選大多數人選擇的,選簡單易用的,就這麼個標準。

另外怎麼選擇開源library,可以參考我的簡書 這麼多開源框架,該用哪個好?


------------


額,為了更清晰的描述retrofit,Stay大致的分析了retrofit源碼。


流程圖如下:

大家可以參考下。這麼經典的設計模式示例,還是很少見的。


詳情可參見:Retrofit分析-漂亮的解耦套路


剛好不少讀者問這個問題,就寫了一篇文章,這裡偷個懶直接貼原文吧:

鏈接:Android開源項目推薦之「網路請求哪家強」 - AndroidDeveloper - 知乎專欄

以下是原文:

不少人老催這個系列,好吧,今天就更新一篇乾貨給你們。網路請求這個話題基本是所有 App 開發都會遇到的,這也難怪之前很多人留言讓我寫寫網路請求到底該怎麼選擇,今天就來說說網路請求到底哪家強!

1. 原則

本篇說的網路請求專指 http 請求,在選擇一個框架之前,我個人有個習慣,就是我喜歡選擇專註的庫,其實在軟體設計領域有一個原則叫做 「單一職責原則」,跟我所說的「專註」不謀而合,一個庫能把一件事做好就很不錯了。現如今有很多大而全的庫,比如這個庫可以網路請求,同時又可以圖片載入,又可以數據存儲,又可以 View 註解等等,我們使用這種庫當然方便了,但是你有沒有想過?這樣會使得你整個項目對它依賴性太強,萬一以後這個庫不維護了,或者中間某個模塊出問題了,這個影響非常大,而且我一直認為大而全的框架可能某一塊都做的不夠好,所以我在選擇的時候更喜歡專註某一領域的框架。


在上面原則的基礎上,所以目前來說單純的網路請求庫就鎖定在了 Volley、OkHttp、Retrofit 三個,android-async-http 的作者已經不維護,所以這裡就不多說了,下面我們分別來說說這三個庫的區別。

2. OkHttp

我們知道在 Android 開發中是可以直接使用現成的 api 進行網路請求的,就是使用 HttpClient、HttpUrlConnection 進行操作,目前 HttpClient 已經被廢棄,而 android-async-http 是基於 HttpClient 的,我想可能也是因為這個原因作者放棄維護。


而 OkHttp 是 Square 公司開源的針對 Java 和 Android 程序,封裝的一個高性能 http 請求庫,所以它的職責跟 HttpUrlConnection 是一樣的,支持 spdy、http 2.0、websocket ,支持同步、非同步,而且 OkHttp 又封裝了線程池,封裝了數據轉換,封裝了參數使用、錯誤處理等,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 ,所以如果你願意你甚至不需要使用圖片載入框架,不過這塊功能沒有一些專門的圖片載入框架強大,對於簡單的需求可以使用,對於稍複雜點的需求還是需要用到專門的圖片載入框架。

Volley 也有缺陷,比如不支持 post 大數據,所以不適合上傳文件。不過 Volley 設計的初衷本身也就是為頻繁的、數據量小的網路請求而生!

關於 Volley 的具體用法可以見我很早在 GitHub 的一個 demo :


https://github.com/stormzhang/AndroidVolley

4. Retrofit

Retrofit 是 Square 公司出品的默認基於 OkHttp 封裝的一套 RESTful 網路請求框架,不了解 RESTful 概念的不妨去搜索學習下,RESTful 可以說是目前流行的一套 api 設計的風格,並不是標準。Retrofit 的封裝可以說是很強大,裡面涉及到一堆的設計模式,你可以通過註解直接配置請求,你可以使用不同的 http 客戶端,雖然默認是用 http ,可以使用不同 Json Converter 來序列化數據,同時提供對 RxJava 的支持,使用 Retrofit + OkHttp + RxJava + Dagger2 可以說是目前比較潮的一套框架,但是需要有比較高的門檻。


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


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

5. Volley VS OkHttp

毫無疑問 Volley 的優勢在於封裝的更好,而使用 OkHttp 你需要有足夠的能力再進行一次封裝。而 OkHttp 的優勢在於性能更高,因為 OkHttp 基於 NIO 和 Okio ,所以性能上要比 Volley更快。


估計有些讀者不理解 IO 和 NIO 的概念,這裡姑且簡單提下,這兩個都是 Java 中的概念,如果我從硬碟讀取數據,第一種方式就是程序一直等,數據讀完後才能繼續操作,這種是最簡單的也叫阻塞式 IO,還有一種就是你讀你的,我程序接著往下執行,等數據處理完你再來通知我,然後再處理回調。而第二種就是 NIO 的方式,非阻塞式。


所以 NIO 當然要比 IO 的性能要好了, 而 Okio 是 Square 公司基於 IO 和 NIO 基礎上做的一個更簡單、高效處理數據流的一個庫。


理論上如果 Volley 和 OkHttp 對比的話,我更傾向於使用 Volley,因為 Volley 內部同樣支持使用 OkHttp ,這點 OkHttp 的性能優勢就沒了,而且 Volley 本身封裝的也更易用,擴展性更好些。

6. OkHttp VS Retrofit

毫無疑問,Retrofit 默認是基於 OkHttp 而做的封裝,這點來說沒有可比性,肯定首選 Retrofit。

7. Volley VS Retrofit

這兩個庫都做了非常不錯的封裝,但是 Retrofit 解耦的更徹底,尤其 Retrofit 2.0 出來,Jake 對之前 1.0 設計不合理的地方做了大量重構,職責更細分,而且 Retrofit 默認使用 OkHttp ,性能上也要比 Volley 佔優勢,再有如果你的項目如果採用了 RxJava ,那更該使用 Retrofit 。


所以說這兩個庫相比,Retrofit 毫無疑問更有優勢,你在能掌握兩個框架的前提下該優先使用 Retrofit。但是個人認為 Retrofit 門檻要比 Volley 稍高些,你要理解他的原理,各種用法,想徹底搞明白還是需要花些功夫的,如果你對它一知半解,那還是建議在商業項目使用 Volley 吧。

8. 總結

所以綜上,如果以上三種網路庫你都能熟練掌握,那麼優先推薦使用 Retrofit ,前提是最好你們的後台 api 也能遵循 RESTful 的風格,其次如果你不想使用或者沒能力掌握 Retrofit ,那麼推薦使用 Volley ,畢竟 Volley 你不需要做過多的封裝,當然如果你們需要上傳大數據,那麼不建議使用 Volley,否則你該採用 OkHttp 。


最後,我知道可能有些人會糾結 Volley 與 OkHttp 的選擇,那是因為我認為 OkHttp 還是需要一定的能力做一層封裝的,如果你有能力封裝的話那不如直接用 Retrofit 了,如果沒能力封裝還是乖乖的用 Volley 吧,如果你能有一些不錯的基於 OkHttp 封裝好的開源庫,那麼另說了,Volley 與 OkHttp 怎麼選擇隨你便唄。


最最後,以上只是我一家之言,如有誤導,概不負責!歡迎討論與交流。

相關閱讀:

Android開源項目推薦之「圖片載入到底哪家強」


okhttp是android平台最好的網路庫,歡迎打臉。

  • volley是一個簡單的非同步http庫,僅此而已。缺點是不支持同步,這點會限制開發模式;不能post大數據,所以不適合用來上傳文件。
  • android-async-http。與volley一樣是非同步網路庫,但volley是封裝的httpUrlConnection,它是封裝的httpClient,而android平台不推薦用HttpClient了,所以這個庫已經不適合android平台了。
  • okhttp是高性能的http庫,支持同步、非同步,而且實現了spdy、http2、websocket協議,api很簡潔易用,和volley一樣實現了http協議的緩存。picasso就是利用okhttp的緩存機制實現其文件緩存,實現的很優雅,很正確,反例就是UIL(universal image loader),自己做的文件緩存,而且不遵守http緩存機制。
  • retrofit與picasso一樣都是在okhttp基礎之上做的封裝,項目中可以直接用了。

另外

  • AndroidAsync這個網路庫使用了nio的方式實現的。okhttp沒有提供nio selector的方式,不過nio更適合大量連接的情況,對於移動平台有點殺雞用牛刀的味道。
  • picasso、uil都不支持inbitmap,項目中有用到picasso的富圖片應用需要注意這點。

謝 @韓嘯 邀請,話說你不是最近在做Okhttp和網路相關的研究嗎?

第一,關於框架的優缺點,直接移步Stackoverflooooooow上的這個問答 Comparison of Android Networking Libraries: OkHTTP, Retrofit, Volley 如果還覺得看不懂,繼續使用關鍵詞 「okhttp vs volley vs retrofit 」 在Google搜索。

第二,題主沒有說明開發什麼類型的app,對於簡單網路請求上面的基本都能滿足需求,對於複雜網路請求,那麼問題來了有多複雜? (逃

第三,每個開源或多或少會有各種坑,你要做的就是踩坑,填坑,再踩坑,再填坑....

最後附上一些視頻參考

  1. 結束不久的Droidcon NYC 2015上Jake的關於Retrofit的演講《Simple HTTP with Retrofit 2》 https://www.youtube.com/watch?v=KIAoQbAu3eA
  2. Google_I_O_2013_-_Volley_Easy_Fast_Networking_for_Android
  3. 《Droidcon Montreal Jake Wharton - A Few Ok Libraries》https://www.youtube.com/watch?v=WvyScM_S88cfeature=youtu.be

答完感覺好像沒什麼X用,(逃


MVP + RxJava + Retrofit + Dagger2 + Realm + Glide
我們的專欄里有關於MVP和Retrofit的詳細解讀,可以了解了解
基於RxJava的一種MVP實現 知乎專欄
深入淺出 Retrofit,這麼牛逼的框架你們還不來看看?


同上面的答案,stack overflow上已經有很多相關討論了 希望能夠動手去看看

這裡說下自己所了解到的
okhttp 和 async http是一個基礎的通信庫,都很強大,但需要自己封裝使用才更方便。另外okhttp已經被谷歌官方用在android源碼中了。
retrofit和 volley是屬於比較高級點的封裝庫了 其中 retrofit是默認使用okhttp volley也支持okhttp作為其底層通信的部件。retrofit的特點是使用清晰簡單的介面,非常方便,而 volley在使用的時候也還簡單,不過要使用高級一點的功能需要自己自定義很多東西

個人常用retrofit+okhttp


安卓比較新的源碼,大概是4.4之後?系統的url.open實現,裡面用的就是okhttp,其他沒研究過。


如果你還沒有領略過設計模式之美,那麼請看看Retrofit的源碼


剛好看到這個話題,看了大家的回答,覺得說的也差不多了。現階段如果要選一個各方面都比較合適的http請求庫,Retrofit是最佳選擇。

我就補充一點:

如果你的項目里有https請求,請直接忽略Android Async Http。 因為它不支持SNI 不支持SNI 不支持SNI !!!


如果是標準的RESTful API,那麼用Retrofit會非常爽!網路交互部分代碼量可以減少90%。同時支持Gson,契合度很高。
另外,Retrofit和okhttp是親兄弟,建議一起用,okhttp是底層庫,能夠支持一些非標準的HTTP方法,比如PATCH方法。

Volley自己的定位是輕量級網路交互,適合大量的,小數據傳輸,如果你的項目比較大,那麼目測還得把volley再次封裝才會好用一些。

async-http這個庫比較老了,用的不多了吧,我不了解,歡迎補充。


個人覺得看懂哪個框架的源碼就用哪個,方便自己填坑。
目前個人認為最好的模式是:RxJava+Retrofit+okhttp


必須是Retrofit
首先Retrofit與okhttp是同一家公司開發出來的,不同之處在與Retrofit是用註解實現了,註解的優點這裡就不多說了,而且Retrofit支持直接將Json字元串解析為JavaBean,而且不局限與一種解析庫(Gson,Jackson等,只需要簡單的配置就可以方便的替換),最為強大的一點在於Retrofit支持RxJava有木有!!!


推薦retrofit+okhttp, 這裡有一個demo,供初學者參考
yangpeiyong/AppDemo: AppDemo for Android De...


看你個人愛好,不論使用哪一種框架,都還需要你自己封裝,然後根據應用而定,比方說,如果你是一個網路請求比較多,但是僅僅是索取數據多而已,次方說智能傢具的一些app,那麼我更建議適用async,方便,好用,自己封裝也很簡單,下載安裝包自我更新也可以。
如果是一個銷售類的app,那麼會偏向使用volley,它本來就是一個短暫快速通信的,它呢,下載大文件就不行了,還有好像volley不支持https,需要自己改裝。
Retrift內部是封裝的okhttp來實現,其實就我用ok的感受,並沒有async方便(僅代表個人意見),但是它有一點很好,支持Rx,那麼開發就更簡單了,入門可能有點難,但是用了之後會覺得很爽,就不想放手了,不過還是根據公司需求自行調整就是了。


這裡okhttp,retrofit是一家,可以認為是同一個,
asynchttp是比較久的老牌框架了,
volley則是Google結合HttpClient和HttpUrlConnection的優點推出優秀的框架:Volley 源碼解析 Volley 是 Google 在 2013 I/O 大會上推出的 Android 非同步網路請求框架和圖片載入框架。特別適合數據量小,通信 @codeKK 開源項目源碼分析站

網路請求推薦OKhttp,至於為什麼,因為android的源碼裡面也可以看到okHttp的影子,不知道這個理由充不充分?
如果你項目中使用了RxJava,則強烈推薦Retrofit,一起使用不要太爽。
volley非常適合去進行數據量不大,但通信頻繁的網路操作,以及大量數據的網路操作,比如下載文件等,volley的表現非常糟糕。
asynchttp則是因為太老了,開源平台隨時都有新鮮血液湧入,不是說asynchttp不好,但是有更好的為什麼不用呢,而且他封裝的是httpClient,6.0已經刪除了httpclient相關api。

網路請求現在推薦用OKHttp,Retrofit就是內置的OkHttp,而且兼容了RxJava,再加上很火的MVP模式,
所以推薦的項目結構是Retrofit+RxJava+MVP
RxJava推薦扔物線寫的Rxjava詳解:給 Android 開發者的 RxJava 詳解
Dagger2可以看下這個問題選擇性的使用:關於Android Dagger2 應用的疑惑?
至於MVP剛開始我還是以前的組件分包,然後mvp單獨抽取,
詳見:7449/Retrofit_RxJava_MVP。
最後發現這樣寫項目到最後整個邏輯還不是很清晰,甚至隨著代碼越多,項目的整體邏輯以及閱讀越來越困難,隨後用功能模塊去分包,這樣看上去的邏輯確實很清晰也很好閱讀
詳見:7449/ZLSimple


一般項目用Volley+OkHTTP,可支持http,https SDDY等,還可以保持Volley的優勢,支持頻繁的網路請求,Volley和Activity生命周期結合做好,離開頁面可以取消網路請求

網路請求複雜,嵌套請求多,團隊技術水平高,可以用retrofit+okhttp+RxAndroid


okhttp,litehttp,兩者相比呢?


首先商業項目選擇開源庫應該保證庫的質量(出處),同時在使用前至少自己已經比較熟悉其原理,也就是能把持大局!不能是別人說好就好,適合自己項目和團隊的才是好的。就拿我們項目來說是基於volley框架拓展了okhttp,替換了文件緩存。


如果項目比較新,並且你想學習使用rxjava,那麼推薦retrofit+okhttp配合使用,代碼量少了很多很多,寫起來很爽,但是有一點需要注意,retrofit沒有網路緩存。


async-hytp太古老了,不推薦使用。

volley比較成熟,自帶緩存,支持自定義請求,但是不適合大文件上傳和下載。如果項目穩定性要求較高,推薦用這個。

最後一點,也是最重要的,無論用哪個網路庫,都要封裝一層,別問我怎麼知道的。


推薦閱讀:

TAG:Android開發 | Android | Android開發者 | Android應用設計 | AndroidStudio |