Glide緩存匯總

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中“?”后面的字符串截去就可以了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蜂桶,一起剝皮案震驚了整個(gè)濱河市儡毕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扑媚,老刑警劉巖腰湾,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異疆股,居然都是意外死亡费坊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門旬痹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來葵萎,“玉大人,你說我怎么就攤上這事唱凯∠弁” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵磕昼,是天一觀的道長卷雕。 經(jīng)常有香客問我,道長票从,這世上最難降的妖魔是什么漫雕? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮峰鄙,結(jié)果婚禮上浸间,老公的妹妹穿的比我還像新娘。我一直安慰自己吟榴,他們只是感情好魁蒜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吩翻,像睡著了一般兜看。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狭瞎,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天细移,我揣著相機(jī)與錄音,去河邊找鬼熊锭。 笑死弧轧,一個(gè)胖子當(dāng)著我的面吹牛雪侥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播精绎,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼速缨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了捺典?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤从祝,失蹤者是張志新(化名)和其女友劉穎襟己,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牍陌,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡擎浴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了毒涧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贮预。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖契讲,靈堂內(nèi)的尸體忽然破棺而出仿吞,到底是詐尸還是另有隱情,我是刑警寧澤捡偏,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布唤冈,位于F島的核電站,受9級特大地震影響银伟,放射性物質(zhì)發(fā)生泄漏你虹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一彤避、第九天 我趴在偏房一處隱蔽的房頂上張望傅物。 院中可真熱鬧,春花似錦琉预、人聲如沸董饰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尖阔。三九已至,卻和暖如春榨咐,著一層夾襖步出監(jiān)牢的瞬間介却,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工块茁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留齿坷,地道東北人桂肌。 一個(gè)月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像永淌,于是被迫代替她去往敵國和親崎场。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容