天天看點

Okhttp, Retrofit, android-async-http, Volley用哪個好

轉載至知乎

okhttp, 

Retrofit,

android-async-http,

volley

這四個架構适用的場合?優缺點?

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

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源碼。

流程圖如下:

Okhttp, Retrofit, android-async-http, Volley用哪個好

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

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的富圖檔應用需要注意這點。

繼續閱讀