繁体   English   中英

Glide:如何预加载图像并确认它是否存储在缓存中?

[英]Glide: How to preload Images and get confirmation that it is stored in cache?

我有一个RecyclerView ,在每一行里面我有ImageView ,我使用Glide从 URL 设置图像。 问题是当我第一次打开并尝试滚动RecyclerView时,只下载了该图像。 显然它会保存到缓存中,下次不会再次下载。

我希望第一次预加载图像,这样当用户滚动时,他/她就不必等待。

请看代码:

@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() function 可用,它将从给定的 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 map。

进行了一个小测试

一项测试涉及三种不同尺寸的ImageView分别为 100x100、200x200 和 300x300 DP。 Glide 的任务是将 8K 图像加载到ImageView中。 然后经过短暂的延迟后,将相同的图像加载到 100x100dp ImageView ,然后再延迟到 300x300dp ImageView

测试表明,由于即时加载到 300x300dp ImageView的速度,原始图像被缓存。

注意:在图像加载开始之前会弹出 Toast 消息。

视频证明:

(如果视频链接坏了,试试这个链接)。

Glide 8K图片加载缓存测试

更新(有点问题范围):如何等到所有图像都预加载?

... 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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM