最近項目里面有個地方是在前面用glide加載圖片后,后面再另外一個地方加載相同圖片時沒有復用glide的緩存,而是自己另外又重新緩存了一套。
查找后發(fā)現(xiàn)問題是glide緩存的key不一致的問題。
從key的生成可以看到和很多參數(shù)有關(guān),逐一排查后,發(fā)現(xiàn)了width和height還有id不一樣。這3個是項目外面?zhèn)鬟M來的。
EngineKey key = keyFactory.buildKey(id, signature, width, height, loadProvider.getCacheDecoder(), loadProvider.getSourceDecoder(), transformation, loadProvider.getEncoder(), transcoder, loadProvider.getSourceEncoder());
key的作用大概是通過下面三步里面去找數(shù)據(jù)
如果都為null,就會進入函數(shù)最后邊的開線程去decode(相當于緩存沒找到,準備重新加載數(shù)據(jù)吧)
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);
進入EngineRunnable的run方法看
resource = decode();private Resource<?> decode() throws Exception { if (isDecodingFromCache()) { return decodeFromCache(); } else { return decodeFromSource(); } }其中l(wèi)oadCache還是loadFromSource的條件
private boolean isDecodingFromCache() { return stage == Stage.CACHE; }默認stage會進去,走到decodeFromCache(),由于cache里沒有,返回null到run方法里面觸發(fā)加載失敗的回調(diào)
if (resource == null) { onLoadFailed(exception); } else { onLoadComplete(resource); }在回調(diào)中重新提交一個runnable,改變stage,下一次run執(zhí)行時,stage==source,就不會去loadCache,而是loadSource。(開線程加載大概流程感覺就像是默認先去緩存中找,沒找到就重新加載)
private void onLoadFailed(Exception e) { if (isDecodingFromCache()) { stage = Stage.SOURCE; manager.submitForSource(this); } else { manager.onException(e); } }loadSource會一路走到
private Resource<T> decodeFromSourceData(A data) throws IOException { final Resource<T> decoded; if (diskCacheStrategy.cacheSource()) { decoded = cacheAndDecodeSourceData(data); } else { long startTime = LogTime.getLogTime(); decoded = loadProvider.getSourceDecoder().decode(data, width, height); if (Log.isLoggable(TAG, Log.VERBOSE)) { logWithTimeAndKey("Decoded from source", startTime); } }這里回調(diào)的decode就是項目中自己設(shè)置的sourceDecoder
項目內(nèi)的代碼象征性的打碼:

之前id和寬高傳的不一樣,導致key不一樣,然后Glide加載的時候通過key找不到緩存,最后就又回調(diào)到項目里面的decode那里來了。
改完后,第一次decode完后,后面用緩存就不會再進入decode了。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網(wǎng)。
新聞熱點
疑難解答
圖片精選