Glide緩存匯總
1蚪腐、Glide有內(nèi)存緩存和磁盤緩存
2箭昵、緩存策略
3、內(nèi)存緩存
4回季、磁盤緩存
5宙枷、緩存位置和大小
6、清理緩存
7茧跋、緩存動態(tài)url
1慰丛、Glide有內(nèi)存緩存和磁盤緩存
緩存資源又分為原圖(SOURCE)和經(jīng)過壓縮變形的處理圖(RESULT)。
2瘾杭、緩存策略
Glide的緩存讀取順序是 內(nèi)存-->磁盤-->網(wǎng)絡(luò)诅病。
Glide緩存策略是——緩存圖片時(shí)默認(rèn)只緩存最終加載的那張圖片(RESULT)。加載圖片的默認(rèn)格式為RGB_565粥烁。
當(dāng)圖片加載請求200×200時(shí)贤笆,則緩存一張200×200的緩存圖片,如果再有同一張圖片但要求是300×300的讨阻,Glide會重新下載并緩存一張300×300的緩存圖片芥永。
3、內(nèi)存緩存
Glide默認(rèn)是會在內(nèi)存中緩存處理圖(RESULT)的钝吮。
如果不想使用內(nèi)存緩存(比如加載GIF圖片)埋涧,這個(gè)時(shí)候可以調(diào)用skipMemoryCache(true)方法跳過內(nèi)存緩存。
使用內(nèi)存緩存減少了耗時(shí)的IO操作奇瘦,可以獲得更快的圖片加載速度棘催。在Android的APP中,Bitmap是Android中的內(nèi)存大戶耳标,頻繁的創(chuàng)建和回收Bitmap必然會引起內(nèi)存抖動醇坝。在Glide中有一個(gè)叫做BitmapPool的類,可以復(fù)用其中的Bitmap對象次坡,從而避免Bitmap對象的創(chuàng)建呼猪,減小內(nèi)存開銷。當(dāng)配置內(nèi)存緩存時(shí)砸琅,我們也應(yīng)該同時(shí)配置BitmapPool的大小宋距。具體方法也是通過自定義的GlideModule來實(shí)現(xiàn)的:
builder.setMemoryCache(new LruResourceCache(yourSizeInBytes));
builder.setBitmapPool(new LruBitmapPool(sizeInBytes));
默認(rèn)的內(nèi)存緩存和bitmapPool的大小由MemorySizeCalculator根據(jù)當(dāng)前設(shè)備的屏幕大小和可用內(nèi)存計(jì)算得到。同時(shí)Glide還支持動態(tài)的緩存大小調(diào)整明棍∠绺铮可以通過setMemoryCategory方法來提高Glide的內(nèi)存緩存大小寇僧,從而加快圖片的加載速度摊腋。
Glide.get(context).setMemoryCategory(MemoryCategory.HIGH);
MemoryCategory有3個(gè)值可供選擇:
MemoryCategory.HIGH(初始緩存大小的1.5倍)
MemoryCategory.NORMAL(初始緩存大小的1倍)
MemoryCategory.LOW(初始緩存大小的0.5倍)
4沸版、磁盤緩存
磁盤緩存策略分為四種,默認(rèn)的是RESULT
DiskCacheStrategy.NONE 不緩存文件
DiskCacheStrategy.SOURCE 只緩存原圖
DiskCacheStrategy.RESULT 只緩存最終加載的圖(默認(rèn)的緩存略)
DiskCacheStrategy.ALL 同時(shí)緩存原圖和結(jié)果圖
通過方法diskCacheStrategy(var)來設(shè)置磁盤緩存策略。
5兴蒸、緩存位置和大小
通過構(gòu)建一個(gè)自定義的GlideModule來配置Glide磁盤緩存的位置和大小视粮。最簡單的方法如下:
public class DiskCacheMoudle implements GlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
builder.setDiskCache(
new InternalCacheDiskCacheFactory(context, "glide_cache", 100 * 1024 * 1024));
//builder.setDiskCache(
// new ExternalCacheDiskCacheFactory(context, "glide_cache", 100 * 1024 * 1024));
}
@Override
public void registerComponents(Context context, Glide glide) {
}
}
其中InternalCache和ExternalCache都最多接收3個(gè)參數(shù):第一個(gè)參數(shù)為Context,沒啥好說的;第二個(gè)為緩存的目錄名稱橙凳;第三個(gè)為緩存大小蕾殴,單位是Byte。它們之間唯一的不同就在于InternalCache構(gòu)建的緩存是在應(yīng)用的內(nèi)部儲存岛啸,而ExternalCache則是在外部儲存钓觉。內(nèi)部儲存中的緩存文件是其他應(yīng)用程序是無法獲取到的,更加安全坚踩。
如果不想把緩存放在上面的兩個(gè)位置怎么辦荡灾?Glide當(dāng)然也支持,具體通過DiskLruCacheFactory來實(shí)現(xiàn):
builder.setDiskCache(
new DiskLruCacheFactory(new DiskLruCacheFactory.CacheDirectoryGetter() {
@Override
public File getCacheDirectory() {
return getMyCacheLocationBlockingIO();
}
}), 100 * 1024 * 1024);
Note: getMyCacheLocationBlockingIO方法返回的文件不能為空瞬铸,而且必須是一個(gè)已經(jīng)創(chuàng)建好的文件目錄批幌,不可以是文件。
內(nèi)存緩存設(shè)置:
//設(shè)置Glide內(nèi)存緩存大小
int maxMemory = (int) Runtime.getRuntime().maxMemory();//獲取系統(tǒng)分配給應(yīng)用的總內(nèi)存大小
int memoryCacheSize = maxMemory / 8;//設(shè)置圖片內(nèi)存緩存占用八分之一
//設(shè)置內(nèi)存緩存大小
builder.setMemoryCache(new LruResourceCache(memoryCacheSize));
Glide配置例子
public class GlideConfiguration implements GlideModule {
public static final int DISK_CACHE_SIZE = 1024 * 1024 * 600;//最多可以緩存多少字節(jié)的數(shù)據(jù)
public static final String DISK_CACHE_NAME = "iflashbuy_glide";
@Override
public void applyOptions(Context context, GlideBuilder builder) {
//1.設(shè)置Glide內(nèi)存緩存大小
int maxMemory = (int) Runtime.getRuntime().maxMemory();//獲取系統(tǒng)分配給應(yīng)用的總內(nèi)存大小
int memoryCacheSize = maxMemory / 8;//設(shè)置圖片內(nèi)存緩存占用八分之一
//設(shè)置內(nèi)存緩存大小
builder.setMemoryCache(new LruResourceCache(memoryCacheSize));
// 2.設(shè)置Glide磁盤緩存大小
File cacheDir = context.getExternalCacheDir();//指定的是數(shù)據(jù)的緩存地址
int diskSize = DISK_CACHE_SIZE;
//設(shè)置磁盤緩存大小
if(cacheDir != null){
builder.setDiskCache(new DiskLruCacheFactory(cacheDir.getPath(), DISK_CACHE_NAME, diskSize));
}
//builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, DISK_CACHE_NAME, diskSize));
//3.設(shè)置圖片解碼格式
// builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
builder.setDecodeFormat(DecodeFormat.PREFER_RGB_565);
//4.設(shè)置BitmapPool緩存內(nèi)存大小
builder.setBitmapPool(new LruBitmapPool(memoryCacheSize));
ViewTarget.setTagId(R.id.glidetag);
}
@Override
public void registerComponents(Context context, Glide glide) {
glide.register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory());
}
}
6嗓节、清理緩存:
清除所有內(nèi)存緩存(需要在Ui線程操作)
Glide.get(this).clearMemory();
清除所有磁盤緩存(需要在子線程操作)
Glide.get(MainActivity.this).clearDiskCache();
注:在使用中的資源不會被清除
7荧缘、動態(tài)緩存URL
一般情況下我們從網(wǎng)絡(luò)上獲取到的圖片Url都是靜態(tài)的,即一張圖片對應(yīng)一個(gè)Url拦宣。那么如果是一張圖片對應(yīng)多個(gè)Url呢截粗?緩存不就沒有意義了。因?yàn)閳D片加載庫都是拿圖片的Url來作為緩存的key的鸵隧,Glide也不例外桐愉,只是會更加復(fù)雜一些。如果你開啟了Glide的log,就會在控制臺看到Glide是如何指定緩存key的掰派。關(guān)于如何打開log,請參考這篇文章(http://www.reibang.com/p/9bd6efca8724)从诲。一般來說,Glide的key由圖片的url靡羡、view的寬和高系洛、屏幕的尺寸大小和signature組成。
在什么情況下才會出現(xiàn)動態(tài)的Url呢略步?一個(gè)很典型的例子就是因?yàn)閳D片的安全問題在原來圖片的Url后面加上訪問憑證描扯。訪問憑證與時(shí)間關(guān)聯(lián),這樣一來趟薄,在不同時(shí)間同一圖片的Url就會不同绽诚,緩存就會失效。
以七牛的私有空間為例,我們來看看如何去緩存這類圖片恩够。從七牛關(guān)于私有空間的文檔中可以得到:最終的Url = 原Url + ?e=過期時(shí)間 + token=下載憑證卒落。那么就只需要在Glide緩存時(shí)將Url中“?”后面的字符串截去就可以了。