開源框架——圖片載入和快取方案總結

Android入墳之路發表於2019-03-28

開源框架——圖片載入和快取方案總結

提到圖片載入和快取方案,我們可能會立刻想到Flide,Fresco等框架,但除了這些還有沒有別的?Android開發歷史上都有哪些有名的圖片載入和快取方案呢?它們各方面的效能對比情況怎麼樣?誰更有優勢?誰佔統治地位呢?今天我們就來簡單總結一下之前都有哪些框架曾經輝煌過,現在又是那個框架的天下。

1、BitmapFun

我們先來看下BitmapFun,BitmapFun函式庫是Android官方教程中的一個圖片載入和快取例項,對於簡單的圖片載入需求來說,使用BitmapFun就夠了。

它的原理很簡單,符合現在流行的圖片載入和快取方案。在獲取圖片時首先從記憶體快取中查詢,如未找到圖片物件,則到本地sdCard卡上查詢,如果還是未查到,再去網路請求。網路請求,並下載成功後,先儲存原圖到某個目錄下,然後再將原圖根據要求進行縮放,縮放後的圖片儲存成另一個圖片,方便使用。

但是講真,先不說BitmapFun效能怎樣,它使用起來確實很麻煩。在使用前先要搞清楚ImageWorker,BitmapWorkerTask,ImageCache,DiskLruCache,ImageResizer,ImageFetcher等等這些類都是做什麼的,然後它們是怎樣配合使用的,所以要想用好它們有一定的學習門檻。

在早期Android開發中,因為沒有其它選擇,所以BitmapFun用的比較多,但現在已經退出了實際專案的開發舞臺。

2、Android-Universal-Image-Loader

簡稱,UIL或者ImageLoader。這個框架老司機們應該不陌生,它曾經是圖片載入框架中的王者,Android開發老手們都用過它。

github地址為:https://github.com/nostra13/Android-Universal-Image-Loader,目前為止已經有超過16.4k+個star,這足以說明它曾經非常火熱。

UIL與gilde最大區別是可定製化,無論執行緒池,下載器,還是解碼器都可以高度自定義。

它提供一系列配置選項,能很好地控制圖片載入和快取的過程。

主要特徵如下:

  • 同步或非同步的多執行緒圖片載入。

  • 高度可自定義:執行緒池、下載器、解碼器、記憶體和磁碟快取、圖片顯示選項等。

  • 每張圖片的顯示支援多種自定義選項:預設存根圖片、解碼選項、Bitmap處理和顯示等。

  • 圖片可快取在記憶體或者磁碟(裝置的檔案系統或者SD卡)上。

  • 可實時監聽圖片載入流程,包括下載進度。

UIL還提供了大量配置方式,如圖片載入狀態的回撥(成功,失敗,進行中),載入動畫等;以及提供了移動端圖片載入框架的快取思路:三級快取策略 記憶體-sd卡-網路。

整個UIL庫分為 ImageLoaderEngine,Cache 及 ImageDownloader,ImageDecoder,BitmapDisplayer,BitmapProcessor 五大模組,其中 Cache又分為 MemoryCache 和 DiskCache 兩部分。

隨著google,facebook釋出自己的圖片載入和快取框架,UIL佔的份額越來越小,但仍有相當部分人在使用它。

3、Picasso

Picasso是著名的square公司的一個開源專案,它除了實現圖片的下載和二級快取功能,還解決了常見的一些問題,如,在adapter中正常的處理ImageView回收和下載的取消問題;使用盡量小的記憶體實現複雜的影象變換等問題。

整個庫分為Dispatcher、RequestHandler、Downloader、PicassoDrawable等模組。

它具有如下優點:

  • 自帶統計監控功能,支援圖片快取使用的監控,包括快取命中率、已使用記憶體大小、節省的流量等。

  • 支援優先順序處理,選擇優先順序高的任務優先處理。

  • 支援飛航模式、併發執行緒數根據網路型別而變。根據網路型別來決定最大併發數,而不是CPU的核數。

  • 將本地快取交給okhttp。Picasso自己沒有實現本地快取,而是交給了okhttp去實現,這樣的好處是可以通過請求okhttp來控制圖片的過期時間。

它的使用很簡單,我們使用一行程式碼即可實現圖片下載並渲染到ImageView中。

Picasso.with(context).load(url).into(imageView);
複製程式碼

官網地址為: http://square.github.io/picasso/

github地址為:https://github.com/square/picasso

可以看到,目前為止已經有超過16.5k+個star,略高於UIL的start。

4、Fresco

Fresco是Facebook開源的功能強大的圖片載入和快取函式庫,相比其他圖片快取庫,Fresco最顯著的特點是具有三級快取:兩級記憶體快取和一級磁碟快取。

主要特性如下:

  • 漸進式地載入JPEG圖片。

  • 支援顯示GIF和WebP動畫。

  • 可擴充套件,可自定義圖片載入和顯示。

  • 在Android 4.X以上的系統上,能將圖片放在Android記憶體一個特殊的區域,從而使得應用執行更流暢,同時極大減低出現OutOfMemoryError的錯誤。

Fresco 可以看做成一個強大的圖片載入元件。其設計有一個叫做 image pipeline 的模組,負責從網路,從本地檔案系統,本地資源載入圖片。為了最大限度節省空間和CPU時間,它含有3級快取設計(2級記憶體,1級檔案)。還設計有一個叫做 Drawees 模組,方便顯示loading圖,當圖片不再顯示在螢幕上時,及時地釋放記憶體和空間佔用。Fresco 支援 Android2.3(API level 9) 及其以上系統。

官網地址: https://www.fresco-cn.org/

github地址為:https://github.com/facebook/fresco

目前為止已經有超過15.4k+個star。

在管理圖片記憶體領域上有著自己一套獨特的方法,在漸進式載入、支援gif等都是它與位列前茅的特性。

5、Glide

Glide是Google推薦的用於Android平臺上的圖片載入和快取函式庫。這個庫被廣泛應用在Google的開源專案中,Glide和Picasso有90%的相似度,只是在細節上還是存在不少區別。

用一句話介紹是:glide是一款專注於提供流暢划動能力的“圖片載入和快取框架”

Glide為包含圖片的滾動列表做了儘可能流暢的優化。除了靜態圖片,Glide也支援GIF格式圖片的顯示。Glide提供了靈活的API可以讓開發者方便地替換下載圖片所用的網路函式庫,預設情況下,它使用HttpUrlConnection作為網路請求模組,開發者也可以根據自己專案的實際需求靈活使用Google的Volley或者Square的OkHttp等函式庫進行替換。

整個庫分為 RequestManager(請求管理器),Engine(資料獲取引擎)、Fetcher(資料獲取器)、MemoryCache(記憶體快取)、DiskLRUCache、Transformation(圖片處理)、Encoder(本地快取儲存)、Registry(圖片型別及解析器配置)、Target(目標)等模組。

Glide 優點:

  • 強大的快取能力。Glide 不僅是支援圖片快取,它支援 Gif、WebP、縮圖,甚至是 Video型別格式。

  • 支援優先順序處理,一般的框架這兩項很難做到。

  • 與 Activity/Fragment 生命週期一致,支援 trimMemory 。

  • 支援 okhttp、Volley擴充套件。Glide 預設通過 UrlConnection 獲取資料,可以配合 okhttp 或是 Volley 使用。另外,ImageLoader、Picasso也都支援 okhttp、Volley。

  • 友好的記憶體設計。可以快取更小的圖片,圖片預設使用RGB565 而不是 ARGB888,可以節省記憶體佔用。

github址為:https://github.com/bumptech/glide

25.1k個star,是圖片載入類框架排名第一的框架,遙遙領先於其它框架。google 在2014開發者大會上演示的camera app就是基於gilde框架開發的。

它的使用方法非常簡單,載入圖片可以使用一行程式碼來完成。

Glide.with(context).load(url).into(imageView);
複製程式碼

拋開BitmapFun不提,我們看下4個框架的對比,

開源框架——圖片載入和快取方案總結

6.總結

有了以上對比,我相信大家在選擇圖片載入和快取方案時,心中已經基本有方向了。


相關文章