亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談Glide緩存key的問題

 更新時間:2018年04月24日 10:53:46   作者:Dynamic_2018  
這篇文章主要介紹了淺談Glide緩存key的問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

最近項(xiàng)目里面有個地方是在前面用glide加載圖片后,后面再另外一個地方加載相同圖片時沒有復(fù)用glide的緩存,而是自己另外又重新緩存了一套。

查找后發(fā)現(xiàn)問題是glide緩存的key不一致的問題。

從key的生成可以看到和很多參數(shù)有關(guān),逐一排查后,發(fā)現(xiàn)了width和height還有id不一樣。這3個是項(xiàng)目外面?zhèn)鬟M(jìn)來的。

EngineKey key = keyFactory.buildKey(id, signature, width, height, loadProvider.getCacheDecoder(),
        loadProvider.getSourceDecoder(), transformation, loadProvider.getEncoder(),
        transcoder, loadProvider.getSourceEncoder());

key的作用大概是通過下面三步里面去找數(shù)據(jù)

如果都為null,就會進(jìn)入函數(shù)最后邊的開線程去decode(相當(dāng)于緩存沒找到,準(zhǔn)備重新加載數(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);

進(jìn)入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;
  }

默認(rèn)stage會進(jìn)去,走到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。(開線程加載大概流程感覺就像是默認(rèn)先去緩存中找,沒找到就重新加載)

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就是項(xiàng)目中自己設(shè)置的sourceDecoder

項(xiàng)目內(nèi)的代碼象征性的打碼:


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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論