You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Glide加载本地Bitmap时,如何获取其缓存文件路径?

解决Glide加载本地Bitmap时获取缓存文件路径的问题

当直接加载内存中的Bitmap对象时,Glide默认不会将其写入磁盘缓存,因此Submit().Get()返回的仍是原Bitmap对象。要获取它的缓存文件路径,需要通过以下步骤让Glide将Bitmap写入磁盘缓存,再通过缓存键定位到文件:

核心思路

  1. 为Bitmap生成稳定的缓存键:Glide的磁盘缓存基于键值对存储,需要确保每个Bitmap对应唯一且稳定的缓存键,避免缓存冲突。
  2. 强制Glide将Bitmap写入磁盘缓存:通过配置缓存策略,让Glide处理Bitmap时生成磁盘缓存文件。
  3. 根据缓存键获取缓存文件:利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 17:20:16