版權(quán)聲明:本文為 stormzhang 原創(chuàng)文章仰坦,可以隨意轉(zhuǎn)載,但必須在明確位置注明出處C灾!;越住!
圖片加載幾乎是任何 Android 項目中必備的需求翔脱,而圖片加載的開源庫也越來越多奴拦,我們姑且在 GitHub 上搜索下 android image 關(guān)鍵字,出來的前五個按照 Star 數(shù)排序的項目如下:
可以看到前四個是大家比較熟知的圖片加載庫届吁,有 UniversalImageLoader错妖、Picasso、Fresco疚沐、Glide暂氯,至于第五個 ion 其實是一個網(wǎng)絡(luò)庫,只不過也提供了圖片加載的功能亮蛔,跟 Volley 類似痴施,也提供圖片加載的功能,但是如果圖片加載是一個強需求的話尔邓,我更喜歡專注的庫晾剖,所以本文只討論單純的圖片加載庫。
我相信大家很糾結(jié)到底該選擇哪一個呢梯嗽?貌似它們在GitHub上都有自己的一席之地齿尽,Star 數(shù)都蠻高的,確實很難抉擇灯节,那么今天我就來給大家分析下循头,圖片加載到底該怎么選擇绵估!
1. UniversalImageLoader
https://github.com/nostra13/Android-Universal-Image-Loader
UIL可以算是老牌最火的圖片加載庫了,使用過這個開源庫的項目可以說是多的令人發(fā)指卡骂,即使到現(xiàn)在 GitHub 上他的 Star 數(shù)仍然是眾多圖片加載庫最多的国裳。
可惜的是該作者在項目中說明,從去年的9月份全跨,他就已經(jīng)停止了對該項目的維護缝左。這就意味著以后任何的 bug 都不會修復(fù),任何的新特性都不會再繼續(xù)開發(fā)浓若,所以毫無疑問 UIL 不推薦在項目中使用了渺杉。
2. Picasso
https://github.com/square/picasso
Picasso 是 Square 公司的大作,名字起的也這么文藝挪钓,叫「畢加索」是越,意為加載圖片就像畫畫一樣,是一門藝術(shù)碌上。這個庫是我之前一直很喜歡的倚评,因為他不僅具備圖片加載應(yīng)有盡有的強大功能,他的調(diào)用也是如此簡潔文藝:
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
以上代碼就是給一個 ImageView 加載遠程圖片的一個示例馏予,是不是很簡潔天梧?
當然不止如此,他還提供更多的用法吗蚌,足以滿足你實際項目中的各種需求腿倚,具體這些用法本文就不提了,可以去官網(wǎng)自行研究蚯妇。
3. Glide
https://github.com/bumptech/glide
Glide 是 Google 一位員工的大作,他完全是基于 Picasso 的暂筝,沿襲了 Picasso 的簡潔風格箩言,但是在此做了大量優(yōu)化與改進。
Glide 默認的 Bitmap 格式是 RGB_565 格式焕襟,而 Picasso 默認的是 ARGB_8888 格式陨收,這個內(nèi)存開銷要小一半。
在磁盤緩存方面鸵赖,Picasso 只會緩存原始尺寸的圖片务漩,而 Glide 緩存的是多種規(guī)格,也就意味著 Glide 會根據(jù)你 ImageView 的大小來緩存相應(yīng)大小的圖片尺寸它褪,比如你 ImageView 大小是200200饵骨,原圖是 400400 ,而使用 Glide 就會緩存 200200 規(guī)格的圖茫打,而 Picasso 只會緩存 400400 規(guī)格的居触。這個改進就會導(dǎo)致 Glide 比 Picasso 加載的速度要快妖混,畢竟少了每次裁剪重新渲染的過程。
最重要的一個特性是 Glide 支持加載 Gif 動態(tài)圖轮洋,而 Picasso 不支持該特性制市。
除此之外,還有很多其他配置選項的增加弊予。
總體來說祥楣,Glide 是在 Picasso 基礎(chǔ)之上進行的二次開發(fā),各個方面做了不少改進汉柒,不過這也導(dǎo)致他的包比 Picasso 大不少误褪,不過也就不到 500k,Picasso 是100多k竭翠,方法數(shù)也比 Picasso 多不少振坚,不過畢竟級別還是蠻小的,影響不是很大斋扰。
4. Fresco
https://github.com/facebook/fresco
Fresco 是 Facebook 出品渡八,他是新一代的圖片加載庫,我們知道 Android 應(yīng)用程序可用的內(nèi)存有限传货,經(jīng)常會因為圖片加載導(dǎo)致 OOM屎鳍,雖然我們有各種手段去優(yōu)化,盡量減少出現(xiàn) OOM 的可能性问裕,但是永遠沒法避免逮壁,尤其某些低端手機 OOM 更是嚴重。而 Facebook 就另辟蹊徑粮宛,既然沒法在 Java 層處理窥淆,我們就在更底層的 Native 堆做手腳。于是 Fresco 將圖片放到一個特別的內(nèi)存區(qū)域叫 Ashmem 區(qū)巍杈,就是屬于 Native 堆忧饭,圖片將不再占用 App 的內(nèi)存,Java 層對此無能為力筷畦,這里是屬于 C++ 的地盤词裤,所以能大大的減少 OOM。
所以此庫很強大鳖宾,不過用起來也比較復(fù)雜吼砂,包也比較大,貌似有2鼎文、3M渔肩,底層涉及到的 C++ 領(lǐng)域,想讀源碼也比較困難漂问。
5. 總結(jié)
綜合來看赖瞒,毫無疑問 Glide 與 Picasso 之間優(yōu)先推薦選擇 Glide女揭,尤其是如果你的項目想要支持 Gif 動態(tài)圖,那更該選擇 Glide 栏饮。
但是如果你的項目使用了 Square 公司的全家桶吧兔,如 Retrofit 或者 OkHttp ,那么搭配 Picasso 一起使用也不是不可袍嬉,兼容性可能會更好些境蔼,占用體積也會少些。
對于一般的 App 使用 Fresco 未免有些大材小用了伺通,大部分情況 Glide 都能滿足你的需求了箍土,但是如果你的 App 中大量使用圖片,比如是類似 Instagram 一類的圖片社交 App 罐监,那么推薦使用 Fresco 吴藻,雖然稍復(fù)雜,但是還是推薦使用 Fresco 弓柱,對提升你 App 的性能與體驗有不少幫助沟堡,值得花時間去研究并應(yīng)用到自己的 App 上來。