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

能否通过Glide按Key获取缓存Bitmap?类似Coil的实现方式

用Glide按Key获取内存缓存Bitmap的实现方案

完全可以实现类似Coil的功能,下面是具体的代码实现和注意事项:

1. 获取Glide的内存缓存实例

Glide的内存缓存由MemoryCache接口管理,直接通过Glide实例获取即可:

val memoryCache = Glide.get(context).memoryCache

2. 按自定义Key查询缓存

Glide允许你在加载图片时设置自定义的内存缓存Key,查询时只需构造对应的StringKey对象即可匹配缓存:

加载图片时设置自定义Key

Glide.with(context)
    .load(yourImageData)
    .override(width, height) // 对应你需要的尺寸
    .memoryCacheKey("your_custom_cache_key") // 自定义缓存Key
    .into(imageView)

查询缓存中的Bitmap

import com.bumptech.glide.load.engine.cache.StringKey

val cacheKey = "your_custom_cache_key"
val targetKey = StringKey(cacheKey)
// 从内存缓存中获取资源,Resource<Bitmap>类型
val cachedResource = memoryCache.get(targetKey)
// 提取实际的Bitmap对象
val cachedBitmap = cachedResource?.get() as? Bitmap

3. 对应你的业务逻辑示例

结合你原本的需求(缓存存在则不渲染PDF),完整逻辑如下:

val context = this // 或者你的上下文对象
val width = 1080 // 目标宽度
val height = 1920 // 目标高度
val cacheKey = "pdf_preview_key"

// 查询内存缓存
val memoryCache = Glide.get(context).memoryCache
val targetKey = StringKey(cacheKey)
val cachedBitmap = memoryCache.get(targetKey)?.get() as? Bitmap

if (cachedBitmap != null) {
    // 缓存存在,用Glide加载缓存的Bitmap
    Glide.with(context)
        .load(cachedBitmap)
        .override(width, height)
        .memoryCacheKey(cacheKey)
        .into(yourImageView)
} else {
    // 缓存不存在,执行PDF渲染逻辑
    renderPdfPage()
}

注意事项

  • 必须保证加载图片时设置的memoryCacheKey和查询时使用的字符串完全一致,否则无法匹配到缓存。
  • 如果没有设置自定义缓存Key,Glide会根据数据源、尺寸、变换规则等生成默认Key,这种情况下无法通过简单字符串查询,必须构造与请求完全一致的Key对象。
  • 缓存中的Resource对象持有Bitmap的引用,调用get()才能获取实际的Bitmap实例,使用完毕后无需手动释放,Glide会自动管理内存。

内容的提问来源于stack exchange,提问作者testivanivan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:01:07