networking - Android網絡庫比較:OkHTTP,Retrofit和Volley




android-networking (9)

異步HTTP客戶端loopj與Volley

我的項目的細節是小的HTTP REST請求,每隔1-5分鐘。

我長時間使用異步HTTP客戶端(1.4.1)。 性能比使用香草Apache httpClient或HTTP URL連接更好。 無論如何,這個庫的新版本並不適合我:庫間例外的回調鏈。

閱讀所有答案激勵我嘗試新事物。 我選擇了Volley HTTP庫。

使用一段時間後,即使沒有進行測試,我也清楚地看到響應時間縮短到1.5倍,2倍排氣。

也許Retrofit比異步HTTP客戶端更好? 我需要嘗試一下。 但我相信沃利不適合我。

來自iOS開發人員學習Android的兩部分問題,涉及Android項目,該項目將提出從JSON到圖像到流式下載音頻和視頻的各種請求:

  1. 在iOS上,我廣泛使用了AFNetworking項目。 有沒有一個等效的Android庫?

  2. 我已經閱讀了Square上的OkHTTPRetrofit以及Volley但還沒有與他們一起開發經驗。 我希望有人能提供一些最佳用例的具體例子。 從我讀過的內容來看,似乎OkHTTP是三者中最強大的,並且可以處理這個項目的需求(如上所述)。


添加到接受的答案和什麼LOG_TAG說...對於Volley在後台線程中解析數據,您必須onResponse Request<YourClassName>因為onResponse方法在主線程上調用,並且在主線程上解析可能會導致UI如果你的反應很大,就會滯後。 here閱讀如何做到這一點。


適用於Android的AFNetworking:

快速的Android網絡在這裡

快速Android網絡庫支持所有類型的HTTP / HTTPS請求,如GET,POST,DELETE,HEAD,PUT,PATCH

快速的Android網絡庫支持下載任何類型的文件

快速的Android網絡庫支持上傳任何類型的文件(支持分段上傳)

快速的Android網絡庫支持取消請求

快速的Android網絡庫支持設置優先級(低,中,高,立即)

快速的Android網絡庫支持RxJava

由於它使用OkHttp作為網絡層,它支持:

快速的Android網絡庫支持HTTP / 2支持,允許同一主機的所有請求共享一個套接字

快速Android網絡庫使用連接池,可減少請求延遲(如果HTTP / 2不可用)

透明GZIP縮小了下載大小

快速的Android網絡庫支持響應緩存,避免網絡完全重複請求

謝謝:圖書館是由我創建的


我希望有人能提供一些最佳用例的具體例子。

如果您正在與Web服務通信,請使用Retrofit。 如果您正在下載圖像,請使用對等庫Picasso。 如果您需要執行位於Retrofit / Picasso之外的HTTP操作,請使用OkHTTP。

Volley大致與Retrofit + Picasso競爭。 另一方面,它是一個圖書館。 在負面方面,它是一個沒有記錄的,不受支持的,“將代碼放在牆上並對其執行I | O演示”庫。

編輯 - Volley現在正式得到Google的支持。 請參閱Google開發人員指南

從我讀過的內容來看,好像OkHTTP是3中最強大的

如果可用,Retrofit會自動使用OkHTTP。 Jake Wharton有一個將Volley和OkHTTP連接起來的Gist

並可以處理該項目的要求(如上所述)。

按照傳統的“流媒體”的定義,你可能不會使用它們來“流式下載音頻和視頻”。 相反,Android的媒體框架將為您處理這些HTTP請求。

話雖如此,如果您打算嘗試自己的基於HTTP的流媒體,OkHTTP應該處理這種情況; 我不記得Volley會如何處理這種情況。 Retrofit和Picasso都不是為此設計的。


在這裡查看Volley透視圖是您的需求的一些優勢:

Volley一方面完全專注於處理單個的小型HTTP請求。 所以如果你的HTTP請求處理有一些怪癖,那麼Volley可能有你的一個鉤子。 另一方面,如果你在圖像處理方面有一些怪癖,那麼你唯一真正的鉤子就是ImageCache 。 “這不是什麼,但也不是很多!”。 但它具有更多其他優點,例如一旦定義請求,從片段或活動中使用它們是無痛的,不像並行AsyncTasks

Volley的優缺點:

那麼Volley有什麼好處?

  • 網絡部分不僅僅是圖像。 Volley打算成為您後端的一個組成部分。 對於基於簡單REST服務的新項目,這可能是一個巨大的勝利。

  • NetworkImageView在請求清理方面比畢加索更具侵略性,GC使用模式更保守。 NetworkImageView完全依賴於強大的內存引用,只要ImageView發出新的請求,或者一旦ImageView移出屏幕,就立即清除所有請求數據。

  • 性能。 這篇文章不會評估這個說法,但是他們已經明確地在內存使用模式中謹慎一些。 Volley還努力為主線程批量回調以減少上下文切換。

  • 排球顯然也有未來。 如果您有興趣,請查看RequestFuture。

  • 如果您要處理高分辨率的壓縮圖像,那麼Volley是唯一可行的解​​決方案。

  • Volley可以與Okhttp一起使用(Okhttp的新版本支持NIO以獲得更好的性能)

  • 排球在活動生命週期中表現出色。

排球問題:
由於Volley是新的,很少有東西不被支持,但它是固定的。

  1. 多部分請求(解決方案: https://github.com/vinaysshenoy/enhanced-volleyhttps://github.com/vinaysshenoy/enhanced-volley

  2. 狀態代碼201被視為錯誤,現在從200到207的狀態代碼成功響應(修正: https://github.com/Vinayrraj/CustomVolleyhttps://github.com/Vinayrraj/CustomVolley

    更新:在Google volley的最新版本中,2XX狀態代碼錯誤現在已fixed !感謝Ficus Kirkpatrick!

  3. 它沒有文檔記載,但許多人都支持在github中抽象化,java可以在here找到文檔。 在android開發人員網站上,您可能會找到使用Volley傳輸網絡數據的指南。 在Google Git上可以找到大量的源代碼

  4. 要解決/更改Volley Framework的重定向策略,請使用Volley和OkHTTP (CommonsWare上面提到的)

你也可以閱讀比較Volley的圖像加載與畢加索

改造:

它由Retrofit發布,它提供了非常易於使用的REST API(更新:支持NIO的Voila!)

改進的優點:

  • 與Volley相比,Retrofit的REST API代碼非常簡短,並且提供了出色的API文檔,並且在社區中擁有良好的支持! 添加到項目中非常容易。

  • 我們可以將它與任何序列化庫一起使用,並進行錯誤處理。

更新: - Retrofit 2.0.0-beta2中有很多非常好的變化

  • 使用OkHttp 2.0進行Retrofit 1.6版現在依賴於Okio來支持java.iojava.nio ,這使得使用ByteStringBuffer訪問,存儲和處理數據變得更容易,可以做一些巧妙的事情來節省CPU和內存。 (僅供參考:這讓我想起Koush的OIN庫支持NIO!)我們可以使用Retrofit和RxJava一起使用rxObservables來組合和鏈接REST調用,以避免醜陋的回調鏈(避免回調地獄!!)

版本1.6的改進缺點:

  • 與內存相關的錯誤處理功能並不好(在舊版本的Retrofit / OkHttp中)並不確定是否使用具有Java NIO支持的Okio進行了改進。

  • 如果我們以不正確的方式使用它,最小線程協助可能導致回調地獄。

(所有上述缺點已在新版本的Retrofit 2.0 beta中解決)

================================================== ======================

更新:

Android Async vs Volley vs Retrofit性能基準測試(毫秒,更低的值更好):

(FYI高於Retrofit基準測試信息會隨著java NIO的支持而提高,因為OKhttp的新版本依賴於NIO Okio庫)

在三次不同重複次數(1 - 25次)的測試中,Volley的速度都在50%到75%之間。 以比AsyncTasks快50%至90%的速度提供改進,以相同的次數達到相同的端點。 在儀表板測試套件中,這轉換為加載/解析數據幾秒鐘。 這是一個巨大的現實世界的差異。 為了使測試更公平,AsyncTasks / Volley的時間包括JSON解析,因為Retrofit會自動為您做。

RetroFit贏得基準測試!

最後,我們決定使用Retrofit進行應用。 它不僅速度很快,而且與我們現有的架構非常吻合。 我們能夠創建一個父回調接口,它可以自動執行錯誤處理,緩存和分頁,而我們的API幾乎不費力氣。 為了在Retrofit中進行合併,我們必須重命名變量以使我們的模型符合GSON,編寫幾個簡單的接口,從舊API中刪除函數,並修改我們的片段以不使用AsyncTasks。 現在我們已經完成了幾個片段的轉換,這非常簡單。 我們不得不克服一些成長中的痛苦和問題,但總的來說,進展順利。 一開始,我們遇到了一些技術問題/錯誤,但Square有一個非常棒的Google+社區,能夠幫助我們完成這項任務。

何時使用Volley?

當我們需要加載圖像以及使用REST API時,我們可以使用Volley!,同時需要多個n / w請求的網絡調用排隊系統! 也Volley有更好的內存相關的錯誤處理比Retrofit!

OkHttp可以和Volley一起使用,Retrofit默認使用OkHttp ! 它具有SPDY支持,連接池,磁盤緩存,透明壓縮! 最近,它已經得到了Okio庫的支持。

來源,信用:Josh Ruesch先生的抽氣volley-vs-retrofit

注意: 關於流式傳輸取決於您想要的流類型,如RTSP / RTCP。


還有另一種選擇: https://github.com/apptik/jushttps://github.com/apptik/jus

  • 它像Volley這樣模塊化,但更多擴展和文檔正在改進,支持不同的HTTP堆棧和轉換器
  • 它有一個模塊來生成服務器API接口映射,如Retrofit
  • 它也有JavaRx支持

還有許多其他方便的功能,如標記,變壓器等


我最近發現了一個名為ion的lib,它為表格帶來了一些額外的功能。

ion內置支持與ImageView集成的圖像下載,JSON(借助GSON),文件和非常方便的UI線程支持。

我在一個新項目中使用它,迄今為止結果一直不錯。 它的使用比Volley或Retrofit簡單得多。


改裝1.9.0與RoboSpice

我在我的應用程序中使用了兩者。

每當我解析嵌套的JSON類時,Robospice的工作速度都比翻新速度快。 因為香料經理會為你做所有事情。 在Retrofit中,您需要創建GsonConverter並將其反序列化。

我在同一活動中創建了兩個片段,並使用兩種相同類型的URL調用同一時間。

09-23 20:12:32.830  16002-16002/com.urbanpro.seeker E/RETROFIT﹕   RestAdapter Init
09-23 20:12:32.833  16002-16002/com.urbanpro.seeker E/RETROFIT﹕ calling the method
09-23 20:12:32.837  16002-16002/com.urbanpro.seeker E/ROBOSPICE﹕ initialzig spice manager
09-23 20:12:32.860  16002-16002/com.urbanpro.seeker E/ROBOSPICE﹕ Executing the method
09-23 20:12:33.537  16002-16002/com.urbanpro.seeker E/ROBOSPICE﹕ on SUcceess
09-23 20:12:33.553  16002-16002/com.urbanpro.seeker E/ROBOSPICE﹕ gettting the all contents
09-23 20:12:33.601  16002-21819/com.urbanpro.seeker E/RETROFIT﹕ deseriazation starts
09-23 20:12:33.603  16002-21819/com.urbanpro.seeker E/RETROFIT﹕ deseriazation ends

Android Studio 2.1中,我遵循這種方式,

轉到應用程序 - > src->主 - > 資產文件夾(如果不可用創建它) - >把你的JAR文件

在你的build.gradle中添加這樣的依賴項,

compile files('src/main/assets/jsoup.jar')
compile files('src/main/assets/org-apache-xmlrpc.jar')
compile files('src/main/assets/org.apache.commons.httpclient.jar')
compile files('src/main/assets/ws-commons-util-1.0.2.jar')

現在同步。 現在你的JAR文件就可以使用了。





android networking retrofit android-networking