国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

淺談Glide緩存key的問題

2019-10-22 18:12:35
字體:
供稿:網(wǎng)友

最近項目里面有個地方是在前面用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)的代碼象征性的打碼:

Glide,緩存,key

之前id和寬高傳的不一樣,導致key不一樣,然后Glide加載的時候通過key找不到緩存,最后就又回調(diào)到項目里面的decode那里來了。

改完后,第一次decode完后,后面用緩存就不會再進入decode了。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 松原市| 玉林市| 奈曼旗| 南涧| 敖汉旗| 兖州市| 界首市| 福建省| 乌什县| 河曲县| 信丰县| 新丰县| 凯里市| 聊城市| 张家港市| 台州市| 苍梧县| 江达县| 泰宁县| 玉环县| 乌拉特中旗| 凤翔县| 西乡县| 巴青县| 杂多县| 胶州市| 萨迦县| 扶沟县| 博湖县| 涡阳县| 泸水县| 井陉县| 弋阳县| 当阳市| 治多县| 灌阳县| 连山| 民乐县| 米林县| 龙里县| 阳山县|