最近在項目中她奥,用到了大量的圖片處理瓮增,各式各樣的,所以在項目完結(jié)之后哩俭,也對這一套圖片處理框架做個總結(jié)绷跑,與各位朋友分享一下。我在本次項目中選擇了Google的Glide作為圖片加載庫携茂。
一你踩、緩存基礎(chǔ)
在 Android App 中必須去做的是一個很好的實現(xiàn)圖片加載組件,盡可能少的去減少網(wǎng)絡(luò)請求,這樣也可以為用戶節(jié)省一些流量带膜,快速的加載圖片和數(shù)據(jù)也會增強用戶體驗吩谦。Glide 在這里并沒有什么不同。Glide 通過使用默認的內(nèi)存和磁環(huán)緩存去避免不必要的網(wǎng)絡(luò)請求膝藕。我們將在后面的博客中去詳細的查看實現(xiàn)細節(jié)式廷。如果你等不到那個時候,通過瀏覽官方文檔這個話題芭挽。目前最重要的是帶著所有的圖片請求放到內(nèi)存和磁盤中滑废。雖然緩存通常是很有用的,但在某些情況下袜爪,它可能不是像期待的行為那樣蠕趁。
二、使用緩存策略
如果你以前用過 Glide辛馆。你會發(fā)現(xiàn)不需要去做任何額外的事情來激活緩存俺陋。它直接就從盒子里取出來用了!然而昙篙,如果你知道一張圖片變化很快腊状,你可能想要避免某些緩存。
Glide 提供了方法去適配內(nèi)存和磁盤緩存行為苔可。讓我們先看看內(nèi)存緩存缴挖。
內(nèi)存緩存
讓我們想象一個非常簡單的請求,從網(wǎng)絡(luò)中加載圖片到 ImageView焚辅。
Glide .with( context )
.load( eatFoodyImages[0] )
.skipMemoryCache( true ) //跳過內(nèi)存緩存
.into( imageViewInternet );
你已經(jīng)注意到映屋,我們調(diào)用了 .skipMemoryCache(true)去明確告訴 Glide 跳過內(nèi)存緩存。這意味著 Glide 將不會把這張圖片放到內(nèi)存緩存中去法焰。這里需要明白的是秧荆,這只是會影響內(nèi)存緩存倔毙!Glide 將會仍然利用磁盤緩存來避免重復的網(wǎng)絡(luò)請求埃仪。這也容易知道 Glide 將會默認將所有的圖片資源放到內(nèi)存緩存中去。因為陕赃,指明調(diào)用 .skipMemoryCache(false)是沒有必要的卵蛉。
提示:注意個事實,如果你初始URL 相同的請求 么库,但沒有調(diào)用 .skipMemoryCache(true)
傻丝,然后你后來又調(diào)用了這個方法,這個資源將會在內(nèi)存中獲取緩存诉儒。當你想要去調(diào)整緩存行為時葡缰,確保你是要調(diào)用所有相同資源的時候。
三、跳過磁盤緩存
正如你上面這部分所了解到的泛释,即使你關(guān)閉內(nèi)存緩存滤愕,請求圖片將會仍然被存儲在設(shè)備的磁盤緩存中。如果你有一張圖片具有相同的 URL怜校,但是變化很快间影,你可能想要連磁盤緩存也一起禁用。
你可以用 .diskCacheStrategy()方法為 Glide 改變磁盤緩存的行為茄茁。不同于 .skipMemoryCache()方法魂贬,它需要一個枚舉作為參數(shù)而不是一個布爾值。如果你想要為一個請求禁用磁盤緩存裙顽。使用枚舉 DiskCacheStrategy.NONE 作為參數(shù)付燥。
Glide .with( context )
.load( eatFoodyImages[0] )
.diskCacheStrategy( DiskCacheStrategy.NONE )
.into( imageViewInternet );
圖片在這段代碼片段中將不會被保存在磁盤緩存中。然而愈犹,默認的它將仍然使用內(nèi)存緩存机蔗!為了把這里兩者都禁用掉,兩個方法一起調(diào)用:
Glide .with( context )
.load( eatFoodyImages[0] )
.skipMemoryCache( true ) .into( imageViewInternet );
.diskCacheStrategy( DiskCacheStrategy.NONE )
四甘萧、自定義磁盤緩存行為
正如我們之前提到的萝嘁,Glide 有多個選項去配置磁盤緩存行為。在我們向你展示這些選項之前扬卷,你必須了解到 Glide 的磁盤緩存是相當復雜的牙言。
Picasso 僅僅緩存了全尺寸的圖像。然而 Glide 緩存了原始圖像怪得,全分辨率圖像和另外小版本的圖像咱枉。比如,如果你請求的一個圖像是 1000x1000 像素的徒恋,但你的 ImageView 是 500x500 像素的蚕断,Glide 將會把這兩個尺寸都進行緩存。
現(xiàn)在你將會理解對于 .diskCacheStrategy()
方法來說不同的枚舉參數(shù)的意義:
DiskCacheStrategy.NONE 什么都不緩存入挣,就像剛討論的那樣
DiskCacheStrategy.SOURCE 僅僅只緩存原來的全分辨率的圖像亿乳。在我們上面的例子中,將會只有一個 1000x1000 像素的圖片
DiskCacheStrategy.RESULT 僅僅緩存最終的圖像径筏,即葛假,降低分辨率后的(或者是轉(zhuǎn)換后的)
DiskCacheStrategy.ALL 緩存所有版本的圖像(默認行為)
作為最后一個例子,如果你有一張圖片滋恬,你知道你將會經(jīng)常操作處理聊训,并做了一堆不同的版本,對其有意義的僅僅是緩存原始分辨率圖片恢氯。因此带斑,我們用 DiskCacheStrategy.SOURCE 去告訴 Glide 僅僅保存原始圖片:
Glide .with( context )
.load( eatFoodyImages[2] )
.diskCacheStrategy( DiskCacheStrategy.SOURCE )
.into( imageViewFile );