能否通过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
相关产品推荐
相关产品推荐

