我开始使用Glide在Android应用中加载图片,但我对它是如何工作以及如何加载图片有一些疑问,我希望你能解释一下。
1.-例如,我有一个包含6行和2列的网格视图,但只有3行可见,直到滚动,Glide加载所有图像,即使它们在屏幕上不可见?或者它将图像加载到图像直到ImageView对用户可见?
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);
}
}
答案 0 :(得分:3)
在这种情况下,Glide与它应加载的数量无关。它取决于您的实施。您在onBindViewHolder
中设置加载Glide的方式意味着每次绑定新的View
时都会加载图片,换句话说,当View
出现在屏幕上时。
此外,Glide也有内部缓存,因此它不会加载已经在其缓存中的图像。
有一点需要注意的是,onBindViewHolder
不仅仅是针对屏幕上当前显示的图像,而且还针对当前显示的图像正上方或下方的图像。这是为传入滚动做准备,因此用户不会看到空视图。
在您的上下文中,假设您有3个可见行,那么可能会为3行调用onBindViewHolder
,可能是第4行和第5行,这是预期的行为。
tldr:您现在的实施很好,以避免额外和低效的图像加载
答案 1 :(得分:2)
Glide在您拨打电话时正好加载图片
Glide.with(context).load(resource)
并获取传递的图像的宽度和高度
.into(imageview)
用于将具有该宽度和高度的图像缓存到本地存储中。
RecyclerViews,因为它的名称告诉,重复使用或回收项目视图。因此,即使您不需要加载任何图像,也应该调用
Glide.with(context).clear(imageview)
在绑定中,当没有图像应该加载时,旧项目图像停止显示在新项目上。