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,你的效率至少可以提高一倍。

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

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

  • 同時推薦用最新的Android Flux來架構你的Android程序,Facebook提出的架構,文檔比較全,數據流總是單向的,飛。用過MVC,MVP,我還是是比較認同Flux的,而且之前公司用的架構模式跟Flux也比較像。
推薦一篇入門博客: AndroidFlux入門
 
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,可以參考我的簡書 這么多開源框架,該用哪個好?


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


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


流程圖如下:



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


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

 
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這個庫比較老了,用的不多了吧,我不了解,歡迎補充。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM