1. 程式人生 > >Android 三大圖片載入框架的對比——ImageLoader,Picasso,Glide

Android 三大圖片載入框架的對比——ImageLoader,Picasso,Glide

一、ImageLaoder介紹

    << Universal ImageLoader 是很早開源的圖片快取,在早期被很多應用使用

  1. 多執行緒下載圖片,圖片可以來源於網路,檔案系統,專案資料夾assets中以及drawable中等
  2. 支援隨意的配置ImageLoader,例如執行緒池,圖片下載器,記憶體快取策略,硬碟快取策略,圖片顯示選項以及其他的一些配置
  3. 支援圖片的記憶體快取,檔案系統快取或者SD卡快取
  4. 支援圖片下載過程的監聽
  5. 根據控制元件(ImageView)的大小對Bitmap進行裁剪,減少Bitmap佔用過多的記憶體
  6. 較好的控制圖片的載入過程,例如暫停圖片載入,重新開始載入圖片,一般使用在ListView,GridView中,滑動過程中暫停載入圖片,停止滑動的時候去載入圖片
  7. 提供在較慢的網路下對圖片進行載入
  8.  預設實現多種記憶體快取演算法 這幾個圖片快取都可以配置快取演算法,不過 ImageLoader 預設實現了較多快取演算法,如 Size 最大先刪除、使用最少先刪除、最近最少使用、先進先刪除、時間最長先刪除等。

 <<ImageLoader的設計及優點

     

設計流程:

    ImageLoader收到展示和載入圖片的任務,並交給ImageLoaderEngine(建立任務,並進行任務排程)分配到具體的執行緒池去完成,任務通過 Cache (本地快取)及 ImageDownloader (從網路獲取圖片)獲取圖片,中間可能經過 BitmapProcessor(圖片處理器) 和 ImageDecoder (圖片解碼)處理,最終轉換為Bitmap 交給 BitmapDisplayer 在 ImageAware 中顯示。

   注:其中 Cache 分為 MemoryCache(記憶體快取) 和 DiskCache(硬碟快取) 兩部分。

       :Processor 資源(圖片)處理器,負責處理資源,比如旋轉、壓縮、擷取等。
二、Picasso介紹

   >> picasso是Square公司開源的一個Android圖形快取庫,可以實現圖片下載和快取功能

    Picasso不僅實現了圖片非同步載入的功能,還解決了android中載入圖片時需要解決的一些常見問題:

   1.在adapter中需要取消已經不在視野範圍的ImageView圖片資源的載入,否則會導致圖片錯位,Picasso已經解決了這個問題。

   2.使用複雜的圖片壓縮轉換來儘可能的減少記憶體消耗

   3.自帶記憶體和硬碟二級快取功能

>>Picasso設計與流程設計

 Picasso 收到載入及顯示圖片的任務,建立 Request 並將它交給 Dispatcher,Dispatcher 分發任務到具體 RequestHandler,任務通過 MemoryCache 及 Handler(資料獲取介面) 獲取圖片,圖片獲取成功後通過 PicassoDrawable 顯示到 Target 中。

注:Dispatcher 負責分發和處理 Action,包括提交、暫停、繼續、取消、網路狀態變化、重試等等。

 三、Glide簡介

   Glide是一個高效、開源、 Android裝置上的媒體管理框架,Glide具有獲取、解碼和展示視訊劇照、圖片、動畫等功能,它還有靈活的API,這些API使開發者能夠將Glide應用在幾乎任何網路協議棧裡。建立Glide的主要目的有兩個,一個是實現平滑的圖片列表滾動效果(滾動流暢),另一個是支援遠端圖片的獲取、大小調整和展示

   >>特點

  • GIF動畫的解碼:通過呼叫Glide.with(context).load(“圖片路徑“)方法,GIF動畫圖片可以自動顯示為動畫效果。如果想有更多的控制,還可以使用Glide.with(context).load(“圖片路徑“).asBitmap()方法載入靜態圖片,使用Glide.with(context).load(“圖片路徑“).asGif()方法載入動畫圖片
  • 本地視訊劇照的解碼:通過呼叫Glide.with(context).load(“圖片路徑“)方法,Glide能夠支援Android裝置中的所有視訊劇照的載入和展示
  • 縮圖的支援:為了減少在同一個view元件裡同時載入多張圖片的時間,可以呼叫Glide.with(context).load(“圖片路徑“).thumbnail(“縮略比例“).into(“view元件“)方法載入一個縮圖,還可以控制thumbnail()中的引數的大小,以控制顯示不同比例大小的縮圖
  • Activity生命週期的整合:當Activity暫停和重啟時,Glide能夠做到智慧的暫停和重新開始請求,並且當Android裝置的連線狀態變化時,所有失敗的請求能夠自動重新請求
  • 轉碼的支援:Glide的toBytes() 和transcode() 兩個方法可以用來獲取、解碼和變換背景圖片,並且transcode() 方法還能夠改變圖片的樣式
  • 動畫的支援:新增支援圖片的淡入淡出動畫效果(呼叫crossFade()方法)和檢視動畫的屬性的功能
  • OkHttp和Volley的支援:預設選擇HttpUrlConnection作為網路協議棧,還可以選擇OkHttp和Volley作為網路協議棧
  • 其他功能:如在圖片載入過程中,使用Drawables物件作為佔位符、圖片請求的優化、圖片的寬度和高度可重新設定、縮圖和原圖的快取等功能
  • <<Glide設計與流程

       簡單的講就是 Glide 收到載入及顯示資源的任務,建立 Request 並將它交給RequestManager(工作管理員),Request 啟動 Engine(資料獲取引擎) 去資料來源獲取資源(通過 Fetcher(資料獲取器) ),獲取到後 Transformation(圖片處理) 處理後交給 Target(目標)。