如何在我的应用中使用 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 缓存?

如何使用 Glide 将 svg 图像加载到图像视图

如何使用 Firebase 中的 Glide 仅加载部分图像?

在最新的 Firebase 版本 (10.2.4) 中使用 Glide 和 FirebaseUI 加载图像

在Glide for Android中离线时加载已获取的图像

如何从用户手机获取联系人 URI 并在 android 中使用 glide 加载