三大圖片快取庫對比
一、四大圖片快取庫基本資訊
ImageLoader | Picasso | Glide | Fresco | |
作者 | nostra13 | Square | Sam sjudd |
|
時間 | 2011/09 | 2013/02 | 2012/12 | 2015.03 |
Star/Issues/PR | 10k/1k 35/120 |
7k/800 58/350 |
5k/600 22/61 |
6k/600 17/50 |
最新版本 | 1.9.5 | 2.5.3 | 4.0 | 0.7 |
Picasso是Square開源的專案,且他的主導者是JakeWharton,所以廣為人知。
Glide是Google員工的開源專案,被一些Google APP使用,在去年的Google I/O上被推薦,不過目前國內資料不多。
Fresco是Facebook在今年上半年開源的圖片快取,主要特點包括:
(1)兩個記憶體快取加上Native快取構成了三級快取
(2)支援流式,可以類似網頁上模糊漸進式顯示圖片
(3)對多幀動畫圖片支援更好,如GIF、WebP
鑑於Fresco還沒釋出正式的1.0版本,後面對比不包括Fresco。
二、基本概念
在正式對比之前,先了解幾個圖片快取通用的概念:
(1)RequestManager:請求生成和管理模組
(2)Engine:引擎部分,負責建立任務(獲取資料),並排程執行
(3)GetDataInterface:資料獲取介面,負責從各個資料來源獲取資料。比如MemoryCache從記憶體快取獲取資料、DiskCache從本地快取獲取資料,下載器從網路獲取資料等。
(4)Displayer:資源(圖片)顯示器,用於顯示或操作資源。比如ImageView,這幾個圖片快取都不僅僅支援ImageView,同時支援其他View以及虛擬的Displayer概念。
(5)Processor:資源(圖片)處理器,負責處理資源,比如旋轉、壓縮、擷取等。
以上概念的稱呼在不同圖片快取中可能不同,比如Displayer在ImageLoader中叫做ImageAware,在Picasso和Glide中叫做Target。
三、共同優點
1.使用簡單
都可以通過一句程式碼實現圖片獲取和顯示。
2.可配置度高,自適應程度高
圖片快取的下載器(重試機制)、解碼器、顯示器、處理器、記憶體快取、本地快取、執行緒池、快取演算法都大都可輕鬆配置。
自適應程度高,根據系統性能初始化快取配置、系統資訊變更後動態調整策略。比如根據CPU核數確定最大併發數,根據可用記憶體確定記憶體快取大小,網路狀態變化時調整最大併發數等。
3.多級快取
都至少有兩級快取、提高圖片載入速度。
4.支援多種資料來源
支援多種資料來源,網路、本地、資源、Assets等
5.支援多種Displayer
不僅僅支援ImageView,同時支援其他View以及虛擬的Displayer概念。
其他小的共同點包括支援動畫】支援Transform處理、獲取EXIF資訊等。
四、ImageLoader設計及優點
1.總體設計及流程
上面是ImageLoader的總體設計圖。整個庫分為ImageLoaderEngine,Cache及ImageDownloader,ImageDecoder,BitmapDisplayer,BitmapProcessor五大模組,其中Cache分為MemoryCache和DiskCache兩部分。
簡單的將就是ImageLoader收到載入及顯示圖片的任務,並將它交給ImageLoaderEngine,ImageLoaderEngine分發任務到具體執行緒池去執行,任務通過Cache及ImageDownloader獲取圖片,中間可能經過BitmapProcessor和ImageDecoder處理,最終轉換為Bitmap交給BitmapDisplayer在ImageAware中顯示。
2.ImageLoader優缺點
(1)支援下載進度監聽
(2)可以在View滾動中暫停圖片載入
通過PauseOnScrollListener介面可以在View滾動中暫停圖片載入。
(3)預設實現多種記憶體快取演算法
這幾個圖片快取都可以配置快取演算法,不過ImageLoader預設實現了較多的快取演算法,如Size最大先刪除、使用最少先刪除、最近少使用、先進先刪除、時間最長先刪除等。
(4)支援本地快取檔名規則定義
(5)沒有對本地檔案壓縮處理的相關API方法,以及預設都是src模式設定圖片,沒有針對background屬性開放API
五、Picasso設計及優點
1.總體設計及流程
上面是Picasso的總體設計圖。整個庫分為Dispatcher,RequestHandler及Downloader,PicassoDrawable等模組。
Dispatcher負責分發和處理Action,包括提交、暫停、繼續、取消、網路狀態變化、重試等等。
簡單的將就是Picasso收到載入及顯示圖片的任務,建立Request並將它交給Dispatcher,Dispatcher分發任務到具體RequestHandler,任務通過MemoryCache及Handler(資料獲取介面)獲取圖片,圖片獲取成功後通過PicassoDrawable顯示到Target中。
需要注意的是上面Data的File System部分,Picasso沒有自定義本地快取的介面,預設使用http的本地快取,API9以上使用OKHttp,以下使用URLConnection,所以如果需要自定義本地快取就需要重定義Downloader。
2.Picasso優點
(1)自帶統計監控功能
支援圖片快取使用的監控,包括快取命中率、已使用記憶體大小、節省的流量等。
(2)支援優先順序處理
每次任務排程前會選擇優先順序高的任務,比如App頁面中Banner的優先順序高於Icon時就很適用。
(3)支援延遲到圖片尺寸計算完成載入
(4)支援飛航模式、併發執行緒數根據網路型別而變
手機切換到飛航模式或網路型別變換時會自動調整執行緒池最大併發數,比如WiFi最大併發為4,4g為3,3g為2。
這裡Picasso根據網路型別來決定最大併發數,而不是CPU核數。
(5)“無”本地快取
“無”本地快取,不是說沒有本地快取,而是Picasso自己沒有實現,交給了Square的另外一個網路庫okhttp去實現,這樣的好處是可以通過請求Response Header中的Cache-Control及Expired控制圖片的過期時間。
(6)支援對圖片的變換操作,如變換大小、旋轉等
(7)在Adapter中回收或取消下載功能
六、Glide設計及優點
1.總體設計及流程
上面是Glide的總體設計圖。整個庫分為RequestManager(請求管理器),Engine(資料獲取引擎)、Fetcher(資料獲取器)、MemoryCache(記憶體快取)、DiskLRUCache、Transformation(圖片處理)、Encoder(本地快取儲存)、Registry(圖片型別及解析器配置)、Target(目標)等模組。
簡單的將就是Glide收到載入及顯示資源的任務,建立Request並將它交給RequestManager,Request啟動Engine去資料來源獲取資源(通過Fetcher),獲取到後Transformation處理後交給Target。
Glide依賴於DiskLRUCache、GifDecoder等開源庫去完成本地快取和Gif圖片解碼工作。
Glide優點
(1)圖片快取->媒體快取
Glide不僅是一個圖片快取,它支援Gif、WebP、縮圖。甚至是Video,所以更改當做一個媒體快取。
(2)支援優先順序處理
(3)與Activity/Fragment生命週期一致,支援trimMemory
Glide對每個context都保持一個RequestManager,通過FragmentTransaction保持與Activity/Fragment生命週期一致,並且有對應的trimMemory介面實現可供呼叫。
(4)支援okhttp、Volley Glide預設通過URLConnection獲取資料,可以配合okhttp或是Volley使用。實際ImageLoader、Picasso也都支援okhttp、Volley。 (5)記憶體友好 ①Glide的記憶體快取有個active的設計 從記憶體快取中取資料時,不像一般的實現用get,而是用remove,再將這個快取資料放到一個value為軟引用的activeResources map中,並計數引用數,在圖片載入完成後進行判斷,如果引用計數為空則回收掉。 ②記憶體快取更小圖片 Glide以url、view_width、view_height、螢幕解析度等作為聯合key,將處理後的圖片快取在記憶體快取中,而不是原始圖片以節省大小。 ③與Activity/Fragment生命週期一致,支援trimMemory ④圖片預設使用RGB_565而不是ARGB_888。 其他:Glide可以通過signature或不使用本地快取支援url過期 七、彙總 三者總體上來說,ImageLoader的功能以及程式碼容易理解長度都一般。 Picasso程式碼雖然只在一個包下,沒有嚴格的包區分,但程式碼簡單、邏輯清晰,一兩個小時就能較深入的理解完。 Glide功能強大,但程式碼量大、流轉複雜。在較深掌握的情況下才推薦使用,免得處理問題難以下手解決。 原文來自Trinea的部落格,連結:http://www.trinea.cn/android/android-image-cache-compare/