如何在我的应用中使用 Glide 加载图像?
Posted
技术标签:
【中文标题】如何在我的应用中使用 Glide 加载图像?【英文标题】:How load images using Glide in my app? 【发布时间】:2018-06-10 00:27:15 【问题描述】:我开始使用 Glide 在 android 应用中加载图像,但我对它的工作原理以及如何加载图像有一些疑问,希望您能解释一下。
1.- 例如,我有一个 6 行 2 列的网格视图,但在滚动之前只有 3 行可见,Glide 会加载所有图像,即使它们在屏幕上不可见?还是加载图像直到图像对用户可见为止?
2.- 如果在启动时加载所有图像,我怎样才能让 Glide 仅在用户可见时才加载图像?因为我有一个包含 30 张图片的 json,但我不希望用户在不滚动查看更多图片时花费大量数据来加载图片。
我正在使用此代码来加载网格的每个图像:
public void onBindViewHolder(MyViewHolder holder, int position)
GalleryPhotoObject image = images.get(position);
if (!Strings.isNullOrEmpty(image.getImage()))
RequestOptions requestOptions = new RequestOptions();
requestOptions.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC);
Glide.with(context).load(Constants.BASE_URL + image.getImage())
.error(Glide.with(context).load(Constants.BASE_URL + image.getImage()))
.thumbnail(0.5f)
.apply(requestOptions)
.into(holder.thumbnail);
【问题讨论】:
【参考方案1】:在这种情况下,Glide 与它应该加载多少无关。这取决于您的实施。您在onBindViewHolder
中设置加载Glide 的方式意味着每次绑定新的View
时,或者换句话说,当View
出现在屏幕上时,就会加载图像。
此外,Glide 也有一个内部缓存,因此它不会加载已经在其缓存中的图像。
需要注意的一点是,onBindViewHolder
不仅适用于当前屏幕上的图像,还适用于当前显示的图像正上方或下方的图像。那是为传入的滚动做准备,这样用户就不会看到空视图。
在您的上下文中,假设您有 3 个可见行,那么可能会为 3 行调用 onBindViewHolder
,并且可能会为第 4 行和第 5 行调用这是预期的行为。
tldr:您现在的实现很好,可以避免额外和低效的图像加载
【讨论】:
感谢您解释 onBindViewHolder 的工作原理,我不知道【参考方案2】:Glide 会在您调用时准确加载图像
Glide.with(context).load(resource)
并取传入图片的宽高
.into(imageview)
用于将具有该宽度和高度的图像缓存到本地存储中。
RecyclerViews 顾名思义,可重复使用或回收项目视图。因此,即使您不需要加载任何图像,您也应该调用
Glide.with(context).clear(imageview)
在您的绑定中,当不应该加载任何图像时,旧项目图像将停止显示在新项目上。
【讨论】:
感谢您的简单解释,我将在我的代码中实现 clear。以上是关于如何在我的应用中使用 Glide 加载图像?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 cakephp4 中使用 Admad cakephp-glide 删除 Glide 缓存?
如何使用 Firebase 中的 Glide 仅加载部分图像?
在最新的 Firebase 版本 (10.2.4) 中使用 Glide 和 FirebaseUI 加载图像