如何使用Glide库在RecyclerView中加载更新的图片而不是旧图片

3
我已经使用Glide库将图像加载到ImageView中,它的效果很好。
依赖项:
compile "com.github.bumptech.glide:glide:4.5.0"
annotationProcessor "com.github.bumptech.glide:compiler:4.5.0"
compile "jp.co.cyberagent.android.gpuimage:gpuimage-library:1.3.0"

在适配器中:

                    Glide.with(context)
                    .load(ImageUrl)
                    .apply(bitmapTransform(new jp.wasabeef.glide.transformations.BlurTransformation(25)
                    ).diskCacheStrategy(DiskCacheStrategy.ALL))
                    .apply(new RequestOptions()
                            .placeholder(R.mipmap.ic_launcher))
                    .into(view);

问题在于当我上传图片并在recyclerview中显示,并从API获取URL时,它会显示缓存中先前添加的图像而不是新的图像。我只需要将新的图像添加到第一个位置,而不是刷新整个列表。
使用以下方法:
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)

上述代码会刷新整个列表,因为它清除了所有缓存数据。我只需要在列表中显示新上传的图片。

如何通过添加URL或仅使用您注册的位图来加载图像?请分享您的适配器。 - propoLis
1
我认为您无法检查特定的URL是否更改了内容。因此,解决方案可以是每次上传图像时使用唯一的URL。 - ADM
1
另一个解决方案是使用图像资源的元数据。您必须利用Glide的.signature()函数。这个可能会有所帮助。简单的解决方案如@ADM所述,每次上传图像时生成新的URL。 - user2756345
2个回答

1

首先,您需要验证服务器/CDN或托管图像的任何其他内容的响应标头。

Glide唯一知道同一URL的图像是否已更新的方法是通过缓存/ETAG标头。

现在是棘手的部分:Glide是一个图像缓存/加载库,它处理内存/磁盘缓存,但不执行实际的网络部分。这由第三方库(如OkHttp)处理,因此您需要扩展Glide模块和/或配置网络库以尊重缓存标头,以适合您的应用程序的方式。

以下是指向Glide GitHub上问题的链接,可以指导您朝正确的方向前进:

https://github.com/bumptech/glide/issues/1257

https://github.com/bumptech/glide/issues/1847

https://github.com/bumptech/glide/issues/463


这方面有示例吗? - IgorGanapolsky

0
请设置如下:-
Glide.with(context)
        .load(img_url)
        .apply(new RequestOptions()
        .placeholder(R.mipmap.personal_pic)
        .diskCacheStrategy(DiskCacheStrategy.ALL))
        .into(iv_profile_pic);

它不起作用。它只显示磁盘缓存中的旧图像,而不是新的图像。 - Joonsoo
使用.signature(new ObjectKey(file.lastModified()))代替.diskCacheStrategy(DiskCacheStrategy.ALL))。 - SAVALIYA REENA

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