Glide加载本地Bitmap时,如何获取其缓存文件路径?
解决Glide加载本地Bitmap时获取缓存文件路径的问题
当直接加载内存中的Bitmap对象时,Glide默认不会将其写入磁盘缓存,因此Submit().Get()返回的仍是原Bitmap对象。要获取它的缓存文件路径,需要通过以下步骤让Glide将Bitmap写入磁盘缓存,再通过缓存键定位到文件:
核心思路
- 为Bitmap生成稳定的缓存键:Glide的磁盘缓存基于键值对存储,需要确保每个Bitmap对应唯一且稳定的缓存键,避免缓存冲突。
- 强制Glide将Bitmap写入磁盘缓存:通过配置缓存策略,让Glide处理Bitmap时生成磁盘缓存文件。
- 根据缓存键获取缓存文件:利用Glide的磁盘缓存实例,通过缓存键查找对应的文件路径。
具体实现代码
1. 自定义Bitmap模型类(生成稳定缓存键)
创建一个包含Bitmap和唯一标识的模型类,重写Equals和GetHashCode方法,确保Glide能生成稳定的缓存键:
public class BitmapModel { public Bitmap Bitmap { get; } public string UniqueId { get; } public BitmapModel(Bitmap bitmap, string uniqueId) { Bitmap = bitmap; UniqueId = uniqueId; } public override bool Equals(object obj) { if (obj is BitmapModel other) { return UniqueId == other.UniqueId; } return false; } public override int GetHashCode() { return UniqueId.GetHashCode(); } }
2. 加载Bitmap并触发磁盘缓存
通过自定义模型加载Bitmap,配置磁盘缓存策略,让Glide将Bitmap写入磁盘:
// 假设已有Bitmap实例 Bitmap bitmap = // 你的Bitmap对象 string bitmapUniqueId = "custom_bitmark_id_001"; // 自定义唯一标识,可根据业务场景生成 var bitmapModel = new BitmapModel(bitmap, bitmapUniqueId); // 获取Glide磁盘缓存实例 var diskCache = Glide.Get(this).DiskCache; // 后台线程执行缓存操作(注意:Submit().Get()是阻塞调用,不要在主线程执行) var futureTarget = Glide.With(this) .Load(bitmapModel) .SetDiskCacheStrategy(DiskCacheStrategy.All) // 强制读写磁盘缓存 .Submit(); // 获取加载结果(此时Glide已将Bitmap写入磁盘缓存) var result = futureTarget.Get(); // 根据模型生成缓存键,查找缓存文件 var cacheKey = Glide.Get(this).GlideContext.GetKeyFactory() .BuildKey(bitmapModel, null, null, null, null, null, null); var cacheFile = diskCache.Get(cacheKey); if (cacheFile != null) { string cacheFilePath = cacheFile.AbsolutePath; // 拿到缓存文件路径,后续可直接加载该文件 using var handler = new Handler(Looper.MainLooper); handler.Post(() => { Glide.With(this) .Load(cacheFile) .SetDiskCacheStrategy(DiskCacheStrategy.All) .Downsample(DownsampleStrategy.CenterInside) .Listener(this) .Into(imageView); }); }
补充说明
- 不要在主线程调用
Submit().Get():该方法会阻塞线程,建议在后台线程(如AsyncTask或线程池)中执行缓存操作。 - 唯一标识的生成:可以根据Bitmap的内容哈希、业务ID等生成,确保每个Bitmap对应唯一的
UniqueId,避免缓存覆盖。
内容的提问来源于stack exchange,提问作者Henrik
相关产品推荐
相关产品推荐

