常用圖片載入框架比較(Glide、volley、Picasso)
阿新 • • 發佈:2019-01-04
Volley 一、ImageRequest: 來對網路圖片進行請求,放入請求佇列,獲取後現在在控制元件上面 步驟: 建立請求佇列mQueue; 建立ImageRequest 請求,並進行配置,並將請求放入請求佇列mqueue中去; ImageRequest只有一個構造方法:對圖片大小和圖片格式進行設定; 原理: 拿到要請求的URL,去快取中遍歷,是否已存在要請求的資源;mCache.getBitmap() 是 從快取中取出請求 得到快取中取出需要的請求結果 是 解析結果 返回結果到主執行緒(mDelivery.postResponse()) 否 結果為null或者快取過期 新增到網路請求佇列 否 進行網路請求(MakeImageRequest) 從網路請求佇列中取出具體的請求 進行請求 解析網路請求 是否快取 是: 新增到快取 否: 返回結果到主執行緒(mDelivery.postResponse()) 二、ImageLoader ImageLoader也可以用於載入網路上的圖片,並且它的內部也是使用ImageRequest來實現的, ImageLoader明顯要比ImageRequest更加高效,因為它不僅可以幫我們對圖片進行快取,還可以過濾掉重複的連結,避免重複傳送請求。 步驟: 1,建立請求佇列; 2,建立imageloader物件,其中imageloader的構造方法第二個引數為imageCache的實現類,實現圖片快取的演算法類。 3,建立imagelistener物件,主要設定圖片載入失敗和載入過程中的圖片設定。 三、NetworkImageView 是一個自定義控制元件,它是繼承自ImageView的,具備ImageView控制元件的所有功能,並且在原生的基礎之上加入了載入網路圖片的功能。 步驟: 1. 建立一個RequestQueue物件。 2. 建立一個ImageLoader物件。 3. 在佈局檔案中新增一個NetworkImageView控制元件。 4. 在程式碼中獲取該控制元件的例項。 5. 設定要載入的圖片地址。 由於NetworkImageView是一個控制元件,在載入圖片的時候它會自動獲取自身的寬高,然後對比網路圖片的寬度,再決定是否需要對圖片進行壓縮。 它的壓縮過程是在內部完全自動化的,它會始終呈現給我們一張大小剛剛好的網路圖片,不會多佔用任何一點記憶體。 如果你不想對圖片進行壓縮,只需要在佈局檔案中把NetworkImageView的layout_width和layout_height都設定成wrap_content就可以了,這 樣NetworkImageView就會將該圖片的原始大小展示出來,不會進行任何壓縮。 Picasso 定義: Picasso是Square公司開源的一個Android圖形快取庫,可以實現圖片下載和快取功能. 採用鏈式呼叫的方式。 原理: 接收到載入和顯示圖片的任務 建立Request,並交給dispatcher進行處理(BitmapHunter) Dispatcher分發任務到具體的RequestHandler ResourceRequesthandler FileRequestHandler NetWorkRequestHandler 任務通過MemoryCache及Handler(資料獲取介面) 來獲取圖片 圖片獲取成功後通過PicassoDrawable顯示到Target(ImageView)中。 優點: 不僅實現了圖片非同步載入的功能,還解決了android中載入圖片時需要解決的一些常見問題: 1.解決了在adapter中需要取消已經不在視野範圍的ImageView圖片資源的載入,否則會導致圖片錯位的這個問題; 2.使用最少的記憶體完成複雜的圖片轉換,比如把下載的圖片轉換為圓角等; 3.自帶記憶體和硬碟二級快取功能; 4.從不同資源進行載入(網路、本地、assests、資源) 5.支援優先順序處理 缺點: 功能較簡單---圖片載入 效能(載入速度)比別的庫慢(Glide、Fresco) 自身實現本地無快取 Glide 介紹: Glide 是一個高效、開源、Android裝置上的媒體管理框架,它遵循BSD、MIT以及Apache 2.0協議釋出。預設使用httpurlconnection作為網路請求模組; 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需要知道activity的生命週期,在Glide.with( ) 方法中,向當前的Activity當中新增一個隱藏的Fragment。通過fragment來監聽activity生命週期的變化。 因為Fragment的生命週期和Activity是同步的,如果Activity被銷燬了,Fragment是可以監聽到的,這樣Glide就可以捕獲這個事件並停止圖片載入了。
轉碼的支援: Glide的toBytes() 和transcode() 兩個方法可以用來獲取、解碼和變換背景圖片,並且transcode() 方法還能夠改變圖片的樣式 動畫的支援: 新增支援圖片的淡入淡出動畫效果(呼叫crossFade()方法)和檢視動畫的屬性的功能。 OkHttp和Volley的支援: 預設選擇HttpUrlConnection作為網路協議棧,還可以選擇OkHttp和Volley作為網路協議棧 其他功能: 如在圖片載入過程中,使用Drawables物件作為佔位符、圖片請求的優化、圖片的寬度和高度可重新設定、縮圖和原圖的快取等功能 設計流程: Glide收到載入及顯示資源的任務 建立Request並將它交給RequestManager(工作管理員) singleRequest ThumbnailRequestCoordinatior Request啟動Engine(資料獲取引擎)去資料來源獲取資源 通過Fetcher獲取資料 LocalURIFetcher OkhttpStreamFetcher 通過快取獲取資料 MemoryCache 獲取到後Transformation(圖片處理)處理後,回撥交給Target(目標)進行圖片顯示 快取策略:( 記憶體–>磁碟–>網路) 記憶體快取
Glide預設是會在記憶體中快取處理圖(RESULT)的。(isCacheable = true)
記憶體快取最大空間(maxSize)=每個程序可用的最大記憶體 * 0.4 磁碟快取 Glide磁碟快取策略分為四種,預設的是RESULT。磁碟快取大小: 250 * 1024 * 1024(250MB) 1.ALL:快取原圖(SOURCE)和處理圖(RESULT) 2.NONE:什麼都不快取 3.SOURCE:只快取原圖(SOURCE) 4.RESULT:只快取處理圖(RESULT)—預設值 清除快取: 清除所有記憶體快取(需要在Ui執行緒操作) Glide.get(this).clearMemory(); 清除所有磁碟快取(需要在子執行緒操作) Glide.get(MainActivity.this).clearDiskCache(); 總結比較: Glide和Picasso都是非常完美的庫。 Picasso: 和Square的網路庫一起能發揮最大作用,因為Picasso可以選擇將網路請求的快取部分交給了okhttp實現。 Glide: 模仿了Picasso的API,而且在他的基礎上加了很多的擴充套件(比如gif等支援),Glide預設的Bitmap格式是RGB_565, 比Picasso預設的ARGB_8888格式的記憶體開銷要小一半; Picasso快取的是全尺寸的(只快取一種),而Glide快取的是跟ImageView尺寸相同的(即56*56和128*128是兩個快取) 。 比較: Glide載入影象以及磁碟快取的方式都要優於Picasso,速度更快,並且Glide更有利於減少OutOfMemoryError的發生,GIF動畫是Glide的殺手鐗。 不過Picasso的圖片質量更高。我的建議是使用Glide,但是將Bitmap格式換成ARGB_8888、讓Glide快取同時快取全尺寸和改變尺寸兩種。 Picasso所能實現的功能,Glide都能做,無非是所需的設定不同。 但是Picasso體積比起Glide小太多如果專案中網路請求本身用的就是okhttp或者retrofit(本質還是okhttp),那麼建議用Picasso, 體積會小很多(Square全家桶的幹活)。 Glide的好處是大型的圖片流,比如gif、Video,如果你們是做美拍、愛拍這種視訊類應用,建議使用。
glide需要知道activity的生命週期,在Glide.with( ) 方法中,向當前的Activity當中新增一個隱藏的Fragment。通過fragment來監聽activity生命週期的變化。 因為Fragment的生命週期和Activity是同步的,如果Activity被銷燬了,Fragment是可以監聽到的,這樣Glide就可以捕獲這個事件並停止圖片載入了。
轉碼的支援: Glide的toBytes() 和transcode() 兩個方法可以用來獲取、解碼和變換背景圖片,並且transcode() 方法還能夠改變圖片的樣式 動畫的支援: 新增支援圖片的淡入淡出動畫效果(呼叫crossFade()方法)和檢視動畫的屬性的功能。 OkHttp和Volley的支援: 預設選擇HttpUrlConnection作為網路協議棧,還可以選擇OkHttp和Volley作為網路協議棧 其他功能: 如在圖片載入過程中,使用Drawables物件作為佔位符、圖片請求的優化、圖片的寬度和高度可重新設定、縮圖和原圖的快取等功能 設計流程: Glide收到載入及顯示資源的任務 建立Request並將它交給RequestManager(工作管理員) singleRequest ThumbnailRequestCoordinatior Request啟動Engine(資料獲取引擎)去資料來源獲取資源 通過Fetcher獲取資料 LocalURIFetcher OkhttpStreamFetcher 通過快取獲取資料 MemoryCache 獲取到後Transformation(圖片處理)處理後,回撥交給Target(目標)進行圖片顯示 快取策略:( 記憶體–>磁碟–>網路) 記憶體快取
Glide預設是會在記憶體中快取處理圖(RESULT)的。(isCacheable = true)
記憶體快取最大空間(maxSize)=每個程序可用的最大記憶體 * 0.4 磁碟快取 Glide磁碟快取策略分為四種,預設的是RESULT。磁碟快取大小: 250 * 1024 * 1024(250MB) 1.ALL:快取原圖(SOURCE)和處理圖(RESULT) 2.NONE:什麼都不快取 3.SOURCE:只快取原圖(SOURCE) 4.RESULT:只快取處理圖(RESULT)—預設值 清除快取: 清除所有記憶體快取(需要在Ui執行緒操作) Glide.get(this).clearMemory(); 清除所有磁碟快取(需要在子執行緒操作) Glide.get(MainActivity.this).clearDiskCache(); 總結比較: Glide和Picasso都是非常完美的庫。 Picasso: 和Square的網路庫一起能發揮最大作用,因為Picasso可以選擇將網路請求的快取部分交給了okhttp實現。 Glide: 模仿了Picasso的API,而且在他的基礎上加了很多的擴充套件(比如gif等支援),Glide預設的Bitmap格式是RGB_565, 比Picasso預設的ARGB_8888格式的記憶體開銷要小一半; Picasso快取的是全尺寸的(只快取一種),而Glide快取的是跟ImageView尺寸相同的(即56*56和128*128是兩個快取) 。 比較: Glide載入影象以及磁碟快取的方式都要優於Picasso,速度更快,並且Glide更有利於減少OutOfMemoryError的發生,GIF動畫是Glide的殺手鐗。 不過Picasso的圖片質量更高。我的建議是使用Glide,但是將Bitmap格式換成ARGB_8888、讓Glide快取同時快取全尺寸和改變尺寸兩種。 Picasso所能實現的功能,Glide都能做,無非是所需的設定不同。 但是Picasso體積比起Glide小太多如果專案中網路請求本身用的就是okhttp或者retrofit(本質還是okhttp),那麼建議用Picasso, 體積會小很多(Square全家桶的幹活)。 Glide的好處是大型的圖片流,比如gif、Video,如果你們是做美拍、愛拍這種視訊類應用,建議使用。