2025-07-08

Android網絡框架比較,今天,公司需要為一個安卓app選擇一個合適的網絡框架,具體我瞭解,主要的安卓網絡框架有okhttp,retrofit,android-async-http,volley。

查找網上的資料,大致可以得到如下不同的言論。

1、個人比較推薦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,你的效率至少可以提高一倍。

目前我所在的公司的技術棧沒用到Volley和android-async-http,如果要用的話,估計還是要做一下二次封裝的。

同時推薦用最新的Android Flux來架構你的Android程序,Facebook提出的架構,文檔比較全,數據流總是單向的,飛。用過MVC,MVP,我還是是比較認同Flux的,而且之前公司用的架構模式跟Flux也比較像。

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

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。

3、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的富圖片應用需要註意這點。

4、如果是標準的RESTful API,那麼用Retrofit會非常爽!網絡交互部分代碼量可以減少90%。同時支持Gson,契合度很高。

另外,Retrofit和okhttp是親兄弟,建議一起用,okhttp是底層庫,能夠支持一些非標準的HTTP方法,比如PATCH方法。

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

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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *