Android Glide緩存策略分析

聽課小知識(shí):第三方庫不要直接使用,封裝后再用
前言:此篇我主要是想了解Glide緩存的封裝機(jī)制,順路看了看數(shù)據(jù)的取出過程,至于數(shù)據(jù)的存儲(chǔ),涉及網(wǎng)絡(luò)層面暫時(shí)不分析了。磨刀不誤砍柴工,感覺先把前三點(diǎn)理解透了,就很好看glide的源碼了

1.內(nèi)存緩存LruCache的使用

淺析LRUCache原理(Android)

2.硬盤緩存DisLruCache的使用

Android DiskLruCache完全解析,硬盤緩存的最佳方案

3.軟弱引用的使用

Android 弱引用和軟引用

4.Glide緩存策略

Glide 系列(四) Glide緩存機(jī)制
Glide緩存機(jī)制大致分為三層:內(nèi)存緩存、弱引用緩存、磁盤緩存。
存的順序是:弱引用、內(nèi)存、磁盤
取的順序是:內(nèi)存、弱引用、磁盤
以下展示的是取的過程

//從內(nèi)存中取數(shù)據(jù)
 EngineResource<?> cached = loadFromCache(key, isMemoryCacheable);
        if (cached != null) {
            cb.onResourceReady(cached);
            if (Log.isLoggable(TAG, Log.VERBOSE)) {
                logWithTimeAndKey("Loaded resource from cache", startTime, key);
            }
            return null;
        }
        
//從弱引用中取數(shù)據(jù)
        EngineResource<?> active = loadFromActiveResources(key, isMemoryCacheable);
        if (active != null) {
            cb.onResourceReady(active);
            if (Log.isLoggable(TAG, Log.VERBOSE)) {
                logWithTimeAndKey("Loaded resource from active resources", startTime, key);
            }
            return null;
        }
//從磁盤中取  
        EngineJob engineJob = engineJobFactory.build(key, isMemoryCacheable);
        DecodeJob<T, Z, R> decodeJob = new DecodeJob<T, Z, R>(key, width, height, fetcher, loadProvider, transformation,
                transcoder, diskCacheProvider, diskCacheStrategy, priority);
        EngineRunnable runnable = new EngineRunnable(engineJob, decodeJob, priority);
        jobs.put(key, engineJob);
        engineJob.addCallback(cb);
        engineJob.start(runnable);

看loadFromCache方法中顯示,當(dāng)cached有值的時(shí)候,將數(shù)據(jù)存進(jìn)了activeResources中

private EngineResource<?> loadFromCache(Key key, boolean isMemoryCacheable) {
        if (!isMemoryCacheable) {
            return null;
        }

        EngineResource<?> cached = getEngineResourceFromCache(key);
        if (cached != null) {
            cached.acquire();
            activeResources.put(key, new ResourceWeakReference(key, cached, getReferenceQueue()));
        }
        return cached;
    }

接著看getEngineResourceFromCache()方法中的第一行代碼,內(nèi)存中刪除了要取出的值

private EngineResource<?> getEngineResourceFromCache(Key key) {
//Removes the value for the given key and returns it if present or null otherwise.
        Resource<?> cached = cache.remove(key);

        final EngineResource result;
        if (cached == null) {
            result = null;
        } else if (cached instanceof EngineResource) {
            // Save an object allocation if we've cached an EngineResource (the typical case).
            result = (EngineResource) cached;
        } else {
            result = new EngineResource(cached, true /*isCacheable*/);
        }
        return result;
    }

所以當(dāng)發(fā)現(xiàn)內(nèi)存中有值的時(shí)候,是先存進(jìn)弱引用中,然后再查找弱引用顯示圖片,弱引用中沒有圖片的話再去硬盤中找。
Tip:采用弱引用的方式是為了防止內(nèi)存泄漏

內(nèi)存緩存

1.關(guān)鍵類
LruResourceCache 內(nèi)部存儲(chǔ)的相關(guān)方法類
MemoryCache 內(nèi)部存儲(chǔ)方法接口
Engine 統(tǒng)領(lǐng)內(nèi)存相關(guān)操作的類
2.封裝機(jī)制
內(nèi)存緩存的封裝機(jī)制很簡單,找到這個(gè)類,你也就明白了

硬盤緩存

1.相關(guān)類
DiskLruCacheWrapper 磁盤存儲(chǔ)相關(guān)方法類
DiskLruCacheFactory 獲得以上實(shí)例的工廠類
ExternalCacheDiskCacheFactory 返回外部存儲(chǔ)文件地址
InternalCacheDiskCacheFactory 返回內(nèi)部存儲(chǔ)文件地址
DecodeJob 對硬盤存儲(chǔ)方法的進(jìn)一步封裝
2.封裝機(jī)制
硬盤緩存相當(dāng)于封裝了兩層,第一層是基礎(chǔ)存儲(chǔ)層,第二層相當(dāng)于業(yè)務(wù)層,就是根據(jù)存儲(chǔ)的需要進(jìn)行存儲(chǔ)

喵語:感覺有很多不到位的地方,還有很多沒有看明白的地方,如果寫的有什么錯(cuò)誤,歡迎大神指出

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 【Android 庫 Glide】 引用 Android圖片加載框架最全解析(一),Glide的基本用法Andro...
    Rtia閱讀 5,892評論 0 22
  • Android緩存機(jī)制:如果沒有緩存,在大量的網(wǎng)絡(luò)請求從遠(yuǎn)程獲取圖片時(shí)會(huì)造成網(wǎng)絡(luò)流量的浪費(fèi),加載速度較慢,用戶體驗(yàn)...
    芒果味的你呀閱讀 4,706評論 13 22
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,626評論 1 32
  • 你在通那邊 意味著有形的距離 不能輕易消除 當(dāng)我望著門前的馬路 我也明白 還是可以通過去 但是你在通那邊! 多少不...
    陳果_周綠閱讀 209評論 0 0
  • by維尼 本人外地矮窮挫一枚,五年前機(jī)緣巧合地來到了魔都念書,和多數(shù)當(dāng)代大學(xué)生一樣,象牙塔里念書是假,逍遙是真,荒...
    e3f105af39ac閱讀 2,731評論 34 45

友情鏈接更多精彩內(nèi)容