1. 程式人生 > >關於Glide——一個高效的圖片載入和快取類庫

關於Glide——一個高效的圖片載入和快取類庫

最近應用經常出現OOM的問題,於是圖片載入的方式由原來的ImageLoader變成了Glide。我也是跟著導師慢慢的學習瞭解,有不對的地方歡迎指正。

首先,我發現Glide的一個限制性,也就是Glide只能用於ImageView,這是一個不好的地方,但是除了這個基本上都是好用的。

Glide載入圖片最簡單的方式如下:

Glide.with(Activity/Context/Fragment/FragmentActivity).load().into(ImageView例項);

                          

從上面這張圖可以看到Glide可以通過with()方法來獲得Activity/Fragment作為引數,為什麼要用Activity/Fragment,這裡就涉及到一個生命週期的問題,不過我更喜歡使用getApplicationContext,這樣Glide圖片載入的生命週期就與Application保持一致,可以避免當用戶進入一個介面,圖片還沒Glide加載出來時,使用者快速退出,可以導致的異常情況。也就是說此時的Glide圖片載入不僅僅是與當前所在的Activity/Fragment同在,而是和當前的這個應用同在。當然了,有可能我們是要在介面卡中使用Glide,那就沒有辦法,只能使用Context了。

從上圖可以看出,Glide圖片載入有很多中獲取圖片的方式,包括檔案獲取、資原始檔Id獲取、Uri等等。

確定了載入的圖片,當然是要把圖片放進對應的控制元件裡面,也就是呼叫into()方法,在括號裡面放入我們的控制元件即可。

除了上面這些,Glide的載入中還可能用到下面的方法。

1.第一個方法很讓我驚訝的就是Glide能載入Gif動圖,在Glide中有asBitmap()和asGif()。很明顯前者是要求像圖片一樣展示,後者則是像Gif動圖一樣展示,當我們載入的是一個gif動圖,並且呼叫asGif()方法,就能實現動圖的展示了。突然好像明白微信聊天的動圖是怎麼來的了,很有可能就是Glide.with().load().asGif().into()這樣一行程式碼實現的呢!

2.Glide有淡入淡出的效果,因為它有

crossFade()

crossFade(intanimationId, int duration)

crossfade(intduration)

這三個方法,其中animationId就是動畫對應的Id,duration則是持續的時間。

3.在開發的過程中,我遇到一個問題,就是介面出現了類似油狀物的部分,後面得知Glide載入時有動畫效果,也就是Glide中下面這行程式碼:

只要呼叫它的dontAnimate()方法就好了,也就是去除載入前的動畫效果。

4.開發過安卓的程式設計師就知道,ImageView有一個ScaleType屬性,在Glide載入時我們可以通過fitCenter()和centerCrop方法直接在程式碼中對ImageView進行設定,至於為什麼只有這兩個,我也不是很清楚,一般情況下我習慣呼叫centerCrop,或者直接設定改ImageView的scale屬性為“centerCrop”。

5.在開發的過程中,我還接觸到diskCacheStrategy()方法。很明顯,這是關於磁碟快取的方法,通過一些資料的查詢,我得知Glide會為每種大小的ImageView快取一次。儘管一張圖片已經快取了一次,但是假如你要在另外一個地方再次以不同尺寸顯示,需要重新下載,調整成新尺寸的大小,然後將這個尺寸的也快取起來。

具體說來就是:比如像淘寶的評論列表中通常會有縮圖對應的ImageView,而我們點開會在另外一個介面有一張大圖對應的ImageView,雖然這是同一張圖片,但因為大小的差異,Glide要下載兩次。

因此我們可以通過呼叫diskCacheStrategy(DiskCacheStrategy.ALL)讓Glide既快取全尺寸又快取其他尺寸。

除此之外,diskCacheStrategy()方法中還可以放入以下引數:

DiskCacheStrategy.NONE(不做任何磁碟快取)

DiskCacheStrategy.RESULT(快取轉換後的資源)

DiskCacheStrategy.SOURCE(快取源資源)

6.在Glide中有下面三個方法:

對應的我發現在Glide中可以呼叫placeholder()方法,其中的引數如下圖:

這個方法是用來設定載入前的預設圖片以及載入失敗時的圖片。