今天,公司需要為一個安卓app選擇一個合適的網絡框架,具體我了解,主要的安卓網絡框架有okhttp,retrofit,android-async-http,volley。
查找網上的資料,大致可以得到如下不同的言論。
1、
- 個人比較推薦Square開源組合,用Retrofit(目前已經是2.0+)+OkHttp基本上已經可以處理任何業務場景了,Square開源庫質量還是值得信賴的。
而且Retrofit提供不同的Json Converter實現(也可以自定義),同時提供RxJava支持(返回Observable對象),配合Jackson(或者Gson)和RxJava,再加上Dagger2,你的效率至少可以提高一倍。
參見我之前的回答: OkHttp在安卓中的使用? - 知乎用戶的回答
- 目前我所在的公司的技術棧沒用到Volley和android-async-http,如果要用的話,估計還是要做一下二次封裝的。
- 同時推薦用最新的Android Flux來架構你的Android程序,Facebook提出的架構,文檔比較全,數據流總是單向的,飛。用過MVC,MVP,我還是是比較認同Flux的,而且之前公司用的架構模式跟Flux也比較像。
我們來先說一個常識性的錯誤:
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分析-漂亮的解耦套路
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的富圖片應用需要注意這點。
另外,Retrofit和okhttp是親兄弟,建議一起用,okhttp是底層庫,能夠支持一些非標准的HTTP方法,比如PATCH方法。
Volley自己的定位是輕量級網絡交互,適合大量的,小數據傳輸,如果你的項目比較大,那么目測還得把volley再次封裝才會好用一些。
async-http這個庫比較老了,用的不多了吧,我不了解,歡迎補充。