1. 程式人生 > >Glide圖片載入神器----官方庫wiki說明文件的翻譯(快取與快取校驗)

Glide圖片載入神器----官方庫wiki說明文件的翻譯(快取與快取校驗)

快取校驗是一個相對複雜的話題和概念,應該儘量少去考慮。本篇幅將給出一個在Glide中如何生成cache key大致的方案,並且如何讓快取更好的為你工作給一些建議提醒。

Cache Keys:
在Glide中Cache Keys用於DiskCacheStrategy.RESULT 的用途包含四個主要部分:

  1. 從DataFetcher裡的getId()方法中返回key的字串。在你的data model上DataFecher僅僅是呼叫了toString()作為返回結果,因此如果你提供的是URL那麼這個字串就是URL形式的,也或者是你提供的是檔案那字串就是檔案的路徑,等等。

  2. 寬高通過呼叫 override(int, int)方法來設定,或者通過 Target’s getSize()方法提供的預設的寬高。

  3. 通過getId()獲取的字串key,在不同的編碼和解碼器中使用者載入和快取你的圖片。只有編碼和解碼器才會影響包含了id的檢索到的位元組。例如,如果你的編碼器只是寫入一個位元組陣列到磁盤裡,那麼這個編碼器不會有id,因為它在任何情況下都不會影響資料。(臥槽!!!這段話好難理解, 暫且這麼翻譯吧, 我也不是很理解, 等以後實際東西寫例子了再來更新解釋, 姑且大傢伙都先蛋疼著,如果有知道意思的, 麻煩底下留言說說,不勝感激啊~~)。

  4. 給每一個載入做簽名的操作(具體看底下的cache invalidation快取校驗部分)

所有以上情況的key都是hash值,是為了建立唯一併且安全的檔名用來儲存在磁碟中。

Cache Invalidation 快取校驗:
由於檔名是hash鑰匙key,因此僅憑特有的url或者檔案路徑去刪除磁碟上的所有快取檔案不是個好方法。問題也是顯而易見的,如果只是載入或者快取了原始圖片那是可以的。但是一旦快取了縮圖亦或是提供了些不同的transformation變換就不行了,在這種情況下每種都會在快取中生成新的檔案,查詢和刪除一個圖片的每種型別的快取檔案版本就變的很困難。
實際上,最好的辦法就是當內容資料改變的時候校驗一個改變了唯一標識的快取檔案(通過url,uri,檔案路徑等等)。

Custom cache invalidation 自定義快取校驗:
改變唯一識別符號是很困難的,而且Glide也提供了signature()簽名api來增加額外的資料到cache key中。Media store的內容適合簽名,最好是其它的內容能保持一些版本的元資料:

  1. Media store的內容:可以使用Glide的MediaStoreSignature類來作為簽名。MediaStoreSignature可以用來混淆日期修改時間、mime type和MediaStore照片的旋轉方向到cache key中。這三個屬性可以準確的獲取編輯和更新的mediaStore的快取。
  2. 檔案:可以使用StringSignature來混淆檔案的修改時間。
  3. Url:儘管當url改變的時候為了確保服務端url的改變能讓客戶端也更新去驗證url作為最好的方式,也還可以使用 StringSignature來簽名混淆,通過特有的metadata來代替。

通過StringSignature來簽名是很簡單的:

Glide.with(yourFragment)
.load(yourFileDataMode)
.signature(new StringSignature(yourVersionMetadata))
.into(yourImageView);

Media store 的簽名也是很簡單的:

Glide.with(fragment)
.load(mediaStoreUri)
.signature(new MediaStoreSignature(mimeType, dateModified, orientation))
.into(view);

通過實現Key介面來自定義自己的簽名,其中的 equals()、hashCode()、updateDiskCacheKey()方法必須實現:

public class IntegerVersionSignature implements Key{
    private int currentVersion;
    public IntegerVersionSignature(int currentVersion){
        this.currentVersion = currentVersion;
    }

    @Override
    public boolean equals(Object o){
        if(o instanceof IntegerVersionSignature){
            IntegerVersionSignature other = (IntegerVersionSignature) o;
            return currentVersion = other.currentVersion;
        }
        Return false;
    }

    @Override
    public int hashCode(){
        return currentVersion;
    }

    @Override
    public void updateDiskCacheKey(MessageDigest messageDigest){
        messageDigest.update(ByteBuffer.allocate(Integer.SIZE).putInt(signature).array());
    }
}

請記住,為了避免降低效能,在你想載入圖片的時候,你需要在後臺批量的載入任意版本的metadata。
也可以使用diskCacheStrategy()的DiskCacheStrategy.NONE來讓磁碟快取失效。

相關推薦

Glide圖片載入神器----官方wiki說明文翻譯快取快取

快取校驗是一個相對複雜的話題和概念,應該儘量少去考慮。本篇幅將給出一個在Glide中如何生成cache key大致的方案,並且如何讓快取更好的為你工作給一些建議提醒。 Cache Keys: 在Glide中Cache Keys用於DiskCacheS

Spark官方調優文翻譯轉載

Spark調優 由於大部分Spark計算都是在記憶體中完成的,所以Spark程式的瓶頸可能由叢集中任意一種資源導致,如:CPU、網路頻寬、或者記憶體等。最常見的情況是,資料能裝進記憶體,而瓶頸是網路頻寬;當然,有時候我們也需要做一些優化調整來減少記憶體佔用,例如將RDD以序列化格式儲存(storing RD

android開源圖表MPAndroidChart文翻譯

public interface OnChartGestureListener { /** * Callbacks when a touch-gesture has started on the chart (ACTION_DOWN) * * @param me

Android圖片載入框架最全解析,實現帶進度的Glide圖片載入功能筆記

參考原文:Android圖片載入框架最全解析(七),實現帶進度的Glide圖片載入功能 擴充套件目標 對Glide進行功能擴充套件,使其支援監聽圖片下載進度的功能 開始 dependencies { compile 'com.github.bumptech.glid

Glide圖片載入回撥

1、方法一:設定圖片中監聽   使用的是SimpleTarget類,他繼承自BaseTarget,需要重寫onResourceReady方法,onResourceReady方法表示載入完成後的回撥,下面列舉了返回為Drawable和Bitmap兩種形式的回撥,除了支援回撥onResourceRea

Glide圖片載入回撥監聽

    前兩篇文章從原始碼的角度對Glide的載入流程進行了分析,這篇文章將對Glide的回撥進行總結。1、方法一:設定圖片中監聽    方法一使用的是SimpleTarget類,他繼承自BaseTarget,需要重寫onResourceReady方法,onResourceR

Android圖片載入框架最全解析,實現帶進度的Glide圖片載入功能

本文同步發表於我的微信公眾號,掃一掃文章底部的二維碼或在微信搜尋 郭霖 即可關注,每天都有文章更新。 我們的Glide系列文章終於要進入收尾篇了。從我開始寫這個系列的第一篇文章時,我就知道這會是一個很長的系列,只是沒有想到竟然會寫這麼久。 在前面

SDWebImage使用——一個可管理遠端圖片載入的類

SDWebImage使用——一個可管理遠端圖片載入的類庫 SDWebImage託管在github上。https://github.com/rs/SDWebImage 這個類庫提供一個UIImageView類別以支援載入來自網路的遠端圖片。具有快取管理、非同步下載、同一個UR

快速掌握Glide圖片載入

我們首先了解一下我們Android的三級緩衝,記憶體緩衝、磁碟緩衝、網路緩衝(這樣的一個載入速度,由快到慢)。那麼三級緩衝的它的工作原理是什麼呢?接下來,我們一起分析分析。               記憶體緩衝應該優先載入,它的速度是三級緩衝中最快的,本地其次,它的速

android glide 圖片載入框架使用

Glide 是一個 Android 上的圖片載入和快取庫,其目的是實現平滑的圖片列表滾動效果。 https://github.com/bumptech/glide wiki:https://github.com/bumptech/glide/wiki 最近專案引入,glid

glide圖片載入框架使用總結

<span style="font-family:SimSun; font-size:18px"><span style="line-height:24.05px; background-color:transparent"></span></span><

Android圖片載入神器之Fresco,基於各種使用場景的講解

Fresco是Facebook開源Android平臺上一個強大的圖片載入庫,也是迄今為止Android平臺上最強大的圖片載入庫。 優點:相對於其他開源的第三方圖片載入庫,Fresco擁有更好的記憶體管理和強大的功能,基本上能滿足所有的日常使用場景。 缺點

RecyclerView的基本使用優化圖片載入、設定條目間距、設定Adapter、設定點選事件等

首先需要v7包 如果顯示的是圖片,可以用下面這個AutoLoadRecyclerView,他可以在快速滑動時停止載入,避免OOM和記憶體資源浪費 public class AutoLoadRecyclerView extends RecyclerView { p

Java核心類-IO-文過濾器FilenameFilter

return 文件過濾 system sof boolean style 接口 strong family 文件操作過濾器(FilenameFilter): listFiles(FilenameFilter filter )方法 : 實際就相當於: //文件過濾器(Fil

獲取bing圖片並自動設置為電腦桌面背景使用 URLDownloadToFile API函數

href 一次 top tel tmp load 1.0 ace 國際 眾所周知,bing搜索網站首頁每日會更新一張圖片,張張漂亮(額,也有一些不合我口味的),特別適合用來做電腦壁紙。 我們想要將bing網站背景圖片設置為電腦桌面背景的通常做法是: 上網,搜索b

Spark官方調優文檔翻譯轉載

區域 ng- 完整 好的 java類型 int 單個 rdd 常見 Spark調優 由於大部分Spark計算都是在內存中完成的,所以Spark程序的瓶頸可能由集群中任意一種資源導致,如:CPU、網絡帶寬、或者內存等。最常見的情況是,數據能裝進內存,而瓶頸是網絡帶寬;當

jdbc中對mysql數據操作的簡單封裝--僅做備忘記錄

nihao lse bin javaee sub getc eva 目的 web-inf 本次使用jdbc中的mysql-connector-java-5.1.47-bin.jar的連接包,下載這個jar包放在javaee項目的WEB-INF/lib目錄下,再把它作為外包j

Hyperledger Fabric 1.3 官方翻譯關鍵概念 (Key Concepts)

身份(Identity) 什麼是身份(What is an Identity)? The different actors in a blockchain network include peers, orderers, client applications,

Hyperledger Fabric 1.3 官方翻譯教程 (Tutorials)

構建你的第一個網路(Building Your First Network) These instructions have been verified to work against the latest stable Docker images and t

Storm Kafka Integration (0.10.x+)官方翻譯:stormkafka整合

Storm Kafka Integration (0.10.x+) 相容性 Apache Kafka版本0.10以上 向kafka寫資料作為拓撲的一部分 你可以建立一個org.apache.storm.kafka.bolt.KafkaBolt的例項,