Glide:如何预加载图像并确认它存储在缓存中?
Glide: How to preload Images and get confirmation that it is stored in cache?
我有一个 RecyclerView
并且在每一行里面我有 ImageView
我正在使用 Glide
设置来自 URL 的图像。问题是当我第一次打开并尝试滚动 RecyclerView
时,只有那些图像被下载。显然它会保存到缓存中,下次不会再下载了。
我希望第一次预加载图像,这样当用户滚动时 he/she 无需等待。
请看代码:
@Override
public void onBindViewHolder(PostAdapter.MyViewHolder holder, int position) {
try {
Post post = postArrayList.get(position);
if (checkNull(post.getDesc())) {
setText(holder.postDesc, postArrayList.get(position).getDesc());
} else if (checkNull(post.getUrl())) {
setImage(holder.postImage, postArrayList.get(position).getUrl());
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void setImage(ImageView image1, String str) {
image1.setVisibility(View.VISIBLE);
Glide.with(context).load(str).
diskCacheStrategy(DiskCacheStrategy.ALL)
.into(image1);
}
据我了解,问题是:如何用Glide预加载图片? 之前一直没搞清楚
这实际上非常简单,几乎与将图像加载到 ImageView
中相同。 Glide 有一个可用的 preload()
函数,可以从给定的 URL 预加载图像。 Select DiskCacheStrategy
最有可能符合您的情况。
Glide.with(context)
.load(imageUrl)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.preload();
如果要更改生成图像的大小,请使用 preload(int width, int height)
。
Glide.with(context)
.load(imageUrl)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.preload(width, height);
如果您的缓存图像实际上没有缓存,请按照 添加自定义 LruCache 映射。
进行了一个小测试
一项测试涉及三种不同尺寸 ImageView
s 100x100、200x200 和 300x300 DP。 Glide 的任务是将 8K 图像加载到 200x200dp ImageView
。然后在短暂的延迟后将相同的图像加载到 100x100dp ImageView
并在另一个延迟后加载到 300x300dp ImageView
.
测试表明,由于即时加载速度为 300x300dp,原始图像被缓存 ImageView
。
注意:Toast 消息会在图像加载开始前弹出。
视频证明:
(如果视频link坏了试试this link)。
更新(有点超出问题范围):如何等到所有图像都预加载?
... rest of YourActivity class
private int imagesLoaded = 0;
private int totalImagesCount = 0;
private void preloadAllImages(ArrayList<String> imagesUrls) {
totalImagesCount = imagesUrls.size();
for (String url : imagesUrls) {
preloadImage(url);
}
}
private void preloadImage(String url) {
Glide.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
// Handle exceptions differently if you want
imagesLoaded++;
if (imagesLoaded == totalImagesCount) {
startMainActivity();
}
return true;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
imagesLoaded++;
if (imagesLoaded == totalImagesCount) {
startMainActivity();
}
return true;
}
})
.preload();
}
我有一个 RecyclerView
并且在每一行里面我有 ImageView
我正在使用 Glide
设置来自 URL 的图像。问题是当我第一次打开并尝试滚动 RecyclerView
时,只有那些图像被下载。显然它会保存到缓存中,下次不会再下载了。
我希望第一次预加载图像,这样当用户滚动时 he/she 无需等待。
请看代码:
@Override
public void onBindViewHolder(PostAdapter.MyViewHolder holder, int position) {
try {
Post post = postArrayList.get(position);
if (checkNull(post.getDesc())) {
setText(holder.postDesc, postArrayList.get(position).getDesc());
} else if (checkNull(post.getUrl())) {
setImage(holder.postImage, postArrayList.get(position).getUrl());
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void setImage(ImageView image1, String str) {
image1.setVisibility(View.VISIBLE);
Glide.with(context).load(str).
diskCacheStrategy(DiskCacheStrategy.ALL)
.into(image1);
}
据我了解,问题是:如何用Glide预加载图片? 之前一直没搞清楚
这实际上非常简单,几乎与将图像加载到 ImageView
中相同。 Glide 有一个可用的 preload()
函数,可以从给定的 URL 预加载图像。 Select DiskCacheStrategy
最有可能符合您的情况。
Glide.with(context)
.load(imageUrl)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.preload();
如果要更改生成图像的大小,请使用 preload(int width, int height)
。
Glide.with(context)
.load(imageUrl)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.preload(width, height);
如果您的缓存图像实际上没有缓存,请按照
进行了一个小测试
一项测试涉及三种不同尺寸 ImageView
s 100x100、200x200 和 300x300 DP。 Glide 的任务是将 8K 图像加载到 200x200dp ImageView
。然后在短暂的延迟后将相同的图像加载到 100x100dp ImageView
并在另一个延迟后加载到 300x300dp ImageView
.
测试表明,由于即时加载速度为 300x300dp,原始图像被缓存 ImageView
。
注意:Toast 消息会在图像加载开始前弹出。
视频证明:
(如果视频link坏了试试this link)。
更新(有点超出问题范围):如何等到所有图像都预加载?
... rest of YourActivity class
private int imagesLoaded = 0;
private int totalImagesCount = 0;
private void preloadAllImages(ArrayList<String> imagesUrls) {
totalImagesCount = imagesUrls.size();
for (String url : imagesUrls) {
preloadImage(url);
}
}
private void preloadImage(String url) {
Glide.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
// Handle exceptions differently if you want
imagesLoaded++;
if (imagesLoaded == totalImagesCount) {
startMainActivity();
}
return true;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
imagesLoaded++;
if (imagesLoaded == totalImagesCount) {
startMainActivity();
}
return true;
}
})
.preload();
}