Glide:预加载图片到内存缓存中(可以带有或不带有磁盘缓存)

8

我正在使用

glide.load(url)
     .diskCacheStrategy(DiskCacheStrategy.ALL)    
     .preload()

为了预加载图片。

然而,我需要它们在内存中而不仅仅是在磁盘上,这样它会在重新访问图片时更快地加载到ImageView 中,就像在将其加载到ImageView 中一次后重新访问图片时所做的那样。

我也尝试过

  glide.load(url)
       .diskCacheStrategy(DiskCacheStrategy.ALL)
       .into(PreloadTarget.obtain(glide, PreloadTarget.SIZE_ORIGINAL, PreloadTarget.SIZE_ORIGINAL))

没有太多运气。

注:我访问了此问题以及其他问题,答案已过时,因此提出了这个问题。


你确定是这样吗?使用 Glide 加载图像后,位图应该在内存中,考虑到它具有内置的“BitmapPool”,如果从任何其他地方调用相同的位图哈希,则会获取相同的位图。调用相同的 URL 应该从位图池中获取位图,而不是从磁盘缓存中获取。 - Furkan Yurdakul
@FurkanYurdakul 我的观察是,在预加载图像后,如果我使用它,它会在空的ImageView中显示一小部分时间;而对于已经加载在任何视图中的图像,则不是这种情况。 - Rahul Tiwari
这可能是因为 Glide 可能尝试从后台线程加载位图,然后将位图放到主线程的目标中。你可能会遇到轻微的延迟,但不应该会造成巨大问题。如果想要的话,可以向每个请求添加回调(我的意思是监听器),自己缓存并在主线程直接从那里加载,如果请求相同的话。 - Furkan Yurdakul
3个回答

1

Glide v4.6.1的预加载

RequestOptions requestOptions = RequestOptions
        .diskCacheStrategy(DiskCacheStrategy.ALL);

Glide.with(appContext)
        .asBitmap()
        .load(model)
        .apply(requestOptions)
        .submit();

1
为了从内存缓存中获取缓存资源,加载的对象必须完全相等。可以在此处查看文档。要验证预加载的对象和加载到ImageView的对象是否相同,请启用Engine类的Glide日志记录。

adb shell setprop log.tag.Engine VERBOSE

然后比较您在预加载和实际加载到ImageView时在日志中看到的EngineKey对象。它们不仅应具有相同的URL和签名,还应具有相同的转换和选项。
如果要加载到ImageView中,请使用

RequestOptions().dontTransform()

来避免基于ImageView参数添加任何转换。

1

参考this文章,您可以将图像缓存到内存中,然后使用。

onlyRetrieveFromCache( true )

仅从内存加载图像


1
这使用磁盘缓存,与内存缓存无关。 - Rahul Tiwari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接