Android開源項目推薦之「圖片載入到底哪家強」
圖片載入幾乎是任何 Android 項目中必備的需求,而圖片載入的開源庫也越來越多,我們姑且在 GitHub 上搜索下 android image 關鍵字,出來的前五個按照 Star 數排序的項目如下:
可以看到前四個是大家比較熟知的圖片載入庫,有 UniversalImageLoader、Picasso、Fresco、Glide,至於第五個 ion 其實是一個網路庫,只不過也提供了圖片載入的功能,跟 Volley 類似,也提供圖片載入的功能,但是如果圖片載入是一個強需求的話,我更喜歡專註的庫,所以本文只討論單純的圖片載入庫。
我相信大家很糾結到底該選擇哪一個呢?貌似它們在GitHub上都有自己的一席之地,Star 數都蠻高的,確實很難抉擇,那麼今天我就來給大家分析下,圖片載入到底該怎麼選擇!
1. UniversalImageLoader
https://github.com/nostra13/Android-Universal-Image-Loader
UIL可以算是老牌最火的圖片載入庫了,使用過這個開源庫的項目可以說是多的令人髮指,即使到現在 GitHub 上他的 Star 數仍然是眾多圖片載入庫最多的。
可惜的是該作者在項目中說明,從去年的9月份,他就已經停止了對該項目的維護。這就意味著以後任何的 bug 都不會修復,任何的新特性都不會再繼續開發,所以毫無疑問 UIL 不推薦在項目中使用了。
2. Picasso
https://github.com/square/picasso
Picasso 是 Square 公司的大作,名字起的也這麼文藝,叫「畢加索」,意為載入圖片就像畫畫一樣,是一門藝術。這個庫是我之前一直很喜歡的,因為他不僅具備圖片載入應有盡有的強大功能,他的調用也是如此簡潔文藝:
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
以上代碼就是給一個 ImageView 載入遠程圖片的一個示例,是不是很簡潔?
當然不止如此,他還提供更多的用法,足以滿足你實際項目中的各種需求,具體這些用法本文就不提了,可以去官網自行研究。
3. Glide
https://github.com/bumptech/glide
Glide 是 Google 一位員工的大作,他完全是基於 Picasso 的,沿襲了 Picasso 的簡潔風格,但是在此做了大量優化與改進。
Glide 默認的 Bitmap 格式是 RGB_565 格式,而 Picasso 默認的是 ARGB_8888 格式,這個內存開銷要小一半。
在磁碟緩存方面,Picasso 只會緩存原始尺寸的圖片,而 Glide 緩存的是多種規格,也就意味著 Glide 會根據你 ImageView 的大小來緩存相應大小的圖片尺寸,比如你 ImageView 大小是200*200,原圖是 400*400 ,而使用 Glide 就會緩存 200*200 規格的圖,而 Picasso 只會緩存 400*400 規格的。這個改進就會導致 Glide 比 Picasso 載入的速度要快,畢竟少了每次裁剪重新渲染的過程。
最重要的一個特性是 Glide 支持載入 Gif 動態圖,而 Picasso 不支持該特性。
除此之外,還有很多其他配置選項的增加。
總體來說,Glide 是在 Picasso 基礎之上進行的二次開發,各個方面做了不少改進,不過這也導致他的包比 Picasso 大不少,不過也就不到 500k,Picasso 是100多k,方法數也比 Picasso 多不少,不過畢竟級別還是蠻小的,影響不是很大。
4. Fresco
https://github.com/facebook/fresco
Fresco 是 Facebook 出品,他是新一代的圖片載入庫,我們知道 Android 應用程序可用的內存有限,經常會因為圖片載入導致 OOM,雖然我們有各種手段去優化,盡量減少出現 OOM 的可能性,但是永遠沒法避免,尤其某些低端手機 OOM 更是嚴重。而 Facebook 就另闢蹊徑,既然沒法在 Java 層處理,我們就在更底層的 Native 堆做手腳。於是 Fresco 將圖片放到一個特別的內存區域叫 Ashmem 區,就是屬於 Native 堆,圖片將不再佔用 App 的內存,Java 層對此無能為力,這裡是屬於 C++ 的地盤,所以能大大的減少 OOM。
所以此庫很強大,不過用起來也比較複雜,包也比較大,貌似有2、3M,底層涉及到的 C++ 領域,想讀源碼也比較困難。
5. 總結
綜合來看,毫無疑問 Glide 與 Picasso 之間優先推薦選擇 Glide,尤其是如果你的項目想要支持 Gif 動態圖,那更該選擇 Glide 。
但是如果你的項目使用了 Square 公司的全家桶,如 Retrofit 或者 OkHttp ,那麼搭配 Picasso 一起使用也不是不可,兼容性可能會更好些,佔用體積也會少些。
對於一般的 App 使用 Fresco 未免有些大材小用了,大部分情況 Glide 都能滿足你的需求了,但是如果你的 App 中大量使用圖片,比如是類似 Instagram 一類的圖片社交 App ,那麼推薦使用 Fresco ,雖然稍複雜,但是還是推薦使用 Fresco ,對提升你 App 的性能與體驗有不少幫助,值得花時間去研究並應用到自己的 App 上來。
PS:支持我繼續更新這個系列就盡情的點贊吧!
本文原創發佈於微信公眾號 AndroidDeveloper「googdev」,不僅是Android原創乾貨分享,也許是最有人情味的技術公眾號,轉載請務必註明出處!
推薦閱讀:
※Github 歡迎所有的持續集成工具
※開啟 Github Pages 自定義域名 HTTPS 和 HTTP/2 支持?
※從 0 開始學習 GitHub 電子書免費送
※GitHub 進行化學實驗進程式控制制?