Glide入門教程——18.Glide Module案例: 自定義緩存

Glide Module 案例: 自定義緩存

原文:Glide Module Example: Customize Caching
作者:Norman Peitek
翻譯:Dexter0218

在上篇文章中,我們學習了使用一個定制的HTTP client接收self-signed HTTPS證書設置到Glide module里的過程。本文,停留在一個低水平,看一下定制Glide緩存部分的案例。

Glide 系列概覽

  1. 入門簡介
  2. 高級加載
  3. 適配器(ListView, GridView)
  4. 占位圖& 淡入淡出動畫
  5. 圖片大小 & 縮放
  6. 播放GIF & 視頻
  7. 緩存基礎
  8. 請求優先級
  9. 縮略圖
  10. 回調:定制view中使用SimpleTarget和ViewTarget
  11. 通知欄和桌面小控件的圖片加載
  12. 異常: 調試和報錯處理
  13. 自定義變換
  14. 用animate()定制動畫
  15. 整合網絡協議棧
  16. 用Modules定制Glide
  17. Glide Module 案例: 接受自簽名HTTPS證書
  18. Glide Module 案例: 自定義緩存
  19. Glide Module 案例: 通過加載自定義大小圖片優化
  20. 動態使用 Model Loaders
  21. 如何旋轉圖片
  22. 系列綜述

自定義內存緩存 ##

希望你已經讀過緩存的基礎知識和Glide module的文章。否則下面的代碼可能看不懂。如果你準備好了,那就開始看吧。

既然我們自定義Glide,我們需要創建一個Glide module。在前面的文章中介紹過,applyOptions方法提供了訪問GlideBuilder對象的方法。GlideBuilder方法提供了幾個方法去自定義Glide的緩存。首先,看看內存緩存。

內存緩存是在設備的RAM中保存圖片。由于沒有IO操作,所以非常快。不利的是由于RAM的大小是收到限制的。在小內存緩存和大內存緩存之間找到一個合適的平衡點并不簡單。Glide內存使用MemorySizeCalculator類去決定內存緩存和bitmap池的大小。Bitmap池保存著在你的應用heap里放著的圖片。Bitmap池的正確大小是很重要的,防止太多重新分配圖片,這樣可以讓垃圾回收器的生命更簡單。

幸運地,你已經接觸到Glide的MemorySizeCalculator類和默認的計算:

MemorySizeCalculator calculator = new MemorySizeCalculator(context);  
int defaultMemoryCacheSize = calculator.getMemoryCacheSize();  
int defaultBitmapPoolSize = calculator.getBitmapPoolSize(); 

如果你想要使用默認值作為基線并調整,上面的代碼是非常有用的。例如,如果你想要你的app比默認多20%的緩存,使用上面的變量來計算它們:

int customMemoryCacheSize = (int) (1.2 * defaultMemoryCacheSize);  
int customBitmapPoolSize = (int) (1.2 * defaultBitmapPoolSize);  

由于我們已經指出我們的內存緩存和Bitmap池的大小,我們可以最終可以編碼我們的Glide module。在applyOption()方法,我們可以在GlideBuilder對象上調用合適的方法:

public class CustomCachingGlideModule implements GlideModule {  
    @Override public void applyOptions(Context context, GlideBuilder builder) {
        MemorySizeCalculator calculator = new MemorySizeCalculator(context);
        int defaultMemoryCacheSize = calculator.getMemoryCacheSize();
        int defaultBitmapPoolSize = calculator.getBitmapPoolSize();

        int customMemoryCacheSize = (int) (1.2 * defaultMemoryCacheSize);
        int customBitmapPoolSize = (int) (1.2 * defaultBitmapPoolSize);

        builder.setMemoryCache( new LruResourceCache( customMemoryCacheSize );
        builder.setBitmapPool( new LruBitmapPool( customBitmapPoolSize );
    }

    @Override public void registerComponents(Context context, Glide glide) {
        // nothing to do here
    }
}

applyOptions()方法的最后兩行可以看出,我們不能直接設置大小。我們創建一個LruResourceCacheLruBitmapPool類的實例。這個兩個都是Glide的默認實現。這樣,如果你想要調整大小,你可以只通過傳遞一個不同大小的值到構造器繼續使用它們。

自定義磁盤緩存

調整磁盤緩存的工作也類似,只是我們需要多做一個決定。磁盤緩存可以存在app的私有目錄下(換句話說,除非你自己的app,其它app訪問不了)。不然,磁盤緩存可以存在外部,公共路徑(更多信息,請看存儲方案)。默認設置下兩個存儲的結合是不可能的。Glide提供了另一個用InternalCacheDiskCacheFactoryExternalCacheDiskCacheFactory的方案。就像內存緩存的構造器,磁盤緩存工廠在它們的構造器里接收一個大小的值:

public class CustomCachingGlideModule implements GlideModule {  
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        // set size & external vs. internal
        int cacheSize100MegaBytes = 104857600;

        builder.setDiskCache(
            new InternalCacheDiskCacheFactory(context, cacheSize100MegaBytes)
        );

        //builder.setDiskCache(
        //new ExternalCacheDiskCacheFactory(context, cacheSize100MegaBytes));
    }

    @Override
    public void registerComponents(Context context, Glide glide) {
        // nothing to do here
    }
}

上面的代碼會設置磁盤緩存到app的內部路徑,并設置最大值到100M。注釋斜線后面的那行,會設置磁盤緩存到外部路徑(并設置最大值到100M)。

上面的兩個方案都不讓你選擇一個特定的路徑。如果你需要移動磁盤緩存到某個特定的位置,你可以利用DiskLruCacheFactory

// or any other path
String downloadDirectoryPath = Environment.getDownloadCacheDirectory().getPath(); 

builder.setDiskCache(  
        new DiskLruCacheFactory( downloadDirectoryPath, cacheSize100MegaBytes )
);

// In case you want to specify a cache sub folder (i.e. "glidecache"):
//builder.setDiskCache(
//    new DiskLruCacheFactory( downloadDirectoryPath, "glidecache", cacheSize100MegaBytes ) 
//);

使用上面的方案去直接設置一個路徑。底部的注釋的代碼會創建并使用一個在你傳遞路徑里的路徑。通常,最后一個參數是byte級緩存的大小。

自定義緩存實現

到目前為止,我們已經展示了如何移動,設置緩存大小。然而,所有調用指向緩存的原始實現。如果你有自己的緩存實現呢?

好吧,你已經知道我們總是創建一個Glide的默認緩存實現實例。你可以創建它的實例并在上面看到的所有方法里傳遞它來完成你自己的實現。你只要確保你的緩存代碼實現了接口方法:

  • Memory cache needs to implement: MemoryCache
  • Bitmap pool needs to implement BitmapPool
  • Disk cache needs to implement: DiskCache

展望

本文中,介紹了如何改變和自定義Glide的緩存。Glide的默認實現組織很好,所以確保你有改變它的原因。如果你要改變一些東西,確保在一定范圍的設備上測試!

后面,我們將學習另一個Glide module主題。下篇文章將介紹在大小確定的target ImageView里如何實現一個圖片請求,我們保證,將會很棒!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容