最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Glide緩存key的問題

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

最近項目里面有個地方是在前面用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就是項目中自己設置的sourceDecoder

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


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

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

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

相關(guān)文章

  • Android模擬器中安裝apk的方法

    Android模擬器中安裝apk的方法

    這篇文章主要介紹了Android模擬器中安裝apk的方法,結(jié)合圖文描述講解了Android的模擬器中實現(xiàn)安裝apk的具體步驟,簡單實用,需要的朋友可以參考下
    2015-12-12
  • Android實現(xiàn)折線走勢圖

    Android實現(xiàn)折線走勢圖

    這篇文章主要為大家詳細介紹了Android實現(xiàn)折線走勢圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Android組件之DrawerLayout實現(xiàn)抽屜菜單

    Android組件之DrawerLayout實現(xiàn)抽屜菜單

    DrawerLayout組件同樣是V4包中的組件,也是直接繼承于ViewGroup類,所以這個類也是一個容器類。接下來通過本文給大家介紹Android組件之DrawerLayout實現(xiàn)抽屜菜單,感興趣的朋友一起學習吧
    2016-02-02
  • Android編程獲取全局Context的方法

    Android編程獲取全局Context的方法

    這篇文章主要介紹了Android編程獲取全局Context的方法,實例分析了基于Application類獲取全局Context的實現(xiàn)步驟與相關(guān)技巧,需要的朋友可以參考下
    2016-01-01
  • Android開發(fā)中的ViewModel使用實戰(zhàn)案例

    Android開發(fā)中的ViewModel使用實戰(zhàn)案例

    在Android應用開發(fā)中,ViewModel作為架構(gòu)組件,重要的功能是管理UI數(shù)據(jù)與生命周期,文章深入分析ViewModel如何感知View的生命周期,以及其核心優(yōu)勢,包括生命周期感知、數(shù)據(jù)持久化和與UI層解耦,幫助開發(fā)者利用ViewModel優(yōu)化應用架構(gòu),需要的朋友可以參考下
    2024-10-10
  • Android中EditText 設置 imeOptions 無效問題的解決方法

    Android中EditText 設置 imeOptions 無效問題的解決方法

    有時候我們需要在EditText 輸出完之后 需要在鍵盤出現(xiàn) 右下角變成“Go”或“前往 搜索時;通常我們需要設置Android:imeOptions屬性,但是今天我發(fā)現(xiàn)設置了無效,下面給大家分享下解決方案
    2016-12-12
  • Android自定義View 實現(xiàn)水波紋動畫引導效果

    Android自定義View 實現(xiàn)水波紋動畫引導效果

    在android程序開發(fā)中,我們經(jīng)常簡單通過自定義view實現(xiàn)水波紋動畫引導功能,下面通過本文給大家分享實現(xiàn)代碼,需要的朋友參考下
    2017-01-01
  • Android Webview添加網(wǎng)頁加載進度條實例詳解

    Android Webview添加網(wǎng)頁加載進度條實例詳解

    這篇文章主要介紹了Android Webview添加網(wǎng)頁加載進度條實例詳解的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • Android截屏保存png圖片的實例代碼

    Android截屏保存png圖片的實例代碼

    這篇文章主要介紹了Android截屏保存png圖片的小例子,可以在應用提供這個小功能,很實用的
    2013-11-11
  • Android調(diào)節(jié)屏幕亮度實現(xiàn)代碼

    Android調(diào)節(jié)屏幕亮度實現(xiàn)代碼

    這篇文章主要介紹了Android調(diào)節(jié)屏幕亮度實現(xiàn)代碼,調(diào)節(jié)屏幕亮度時,先設置當前activity亮度,再并保存為系統(tǒng)亮度即可,本文分別給出兩個步驟的實現(xiàn)代碼,需要的朋友可以參考下
    2015-05-05

最新評論

开原市| 天祝| 如东县| 闽侯县| 布拖县| 德州市| 莱阳市| 临洮县| 安溪县| 北流市| 南安市| 岗巴县| 平谷区| 衡东县| 石首市| 东宁县| 三门峡市| 宜君县| 汤原县| 洛阳市| 叙永县| 克什克腾旗| 靖州| 屏边| 乐东| 田东县| 宁国市| 南安市| 永新县| 施甸县| 尉犁县| 清水河县| 玉门市| 霍山县| 常山县| 分宜县| 阜宁县| 醴陵市| 辉县市| 丰原市| 汾西县|