Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Glide:如何预加载图像并确认它存储在缓存中?_Java_Android_Android Glide - Fatal编程技术网

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

Java Glide:如何预加载图像并确认它存储在缓存中?,java,android,android-glide,Java,Android,Android Glide,我有一个RecyclerView,在每一行的内部我有ImageView,我使用Glide从URL设置图像。问题是当我第一次打开并尝试滚动RecyclerView时,只下载图像。显然,它会保存到缓存中,下次不会再下载 我想第一次预加载图像,这样当用户滚动时,他/她就不必等待了 请参阅代码: @Override public void onBindViewHolder(PostAdapter.MyViewHolder holder, int position) { try {

我有一个
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()
函数,可以从给定的URL预加载图像。选择最适合您的情况的
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贴图

进行了一个小测试 测试涉及三种不同尺寸的图像视图,分别为100x100、200x200和300x300 DP。Glide的任务是将8K图像加载到200x200dp
ImageView
。然后在短时间延迟后,将相同的图像加载到100x100dp
ImageView
中,并在另一次延迟后加载到300x300dp
ImageView

测试表明,由于将原始图像快速加载到300x300dp
ImageView
中,因此缓存了原始图像

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

视频校对:

(如果视频链接断开,请尝试)

更新(有点不成问题的范围):如何等待所有图像都预加载?
。。。活动课的其他部分
私有int-imagesLoaded=0;
私有int TotalImageScont=0;
专用空白预处理图像(ArrayList imagesUrls){
TotalImageScont=imagesUrls.size();
for(字符串url:imagesUrls){
预加载图像(url);
}
}
私有图像(字符串url){
用(这个)滑翔
.load(url)
.diskCacheStrategy(diskCacheStrategy.ALL)
.listener(新的RequestListener(){
@凌驾
public boolean onload失败(@Nullable glide,对象模型,目标,boolean isFirstResource){
//如果需要,请以不同的方式处理异常
imagesLoaded++;
if(imagesLoaded==totalimagesont){
开始不活动();
}
返回true;
}
@凌驾
公共布尔onResourceReady(可绘制资源、对象模型、目标、数据源数据源、布尔isFirstResource){
imagesLoaded++;
if(imagesLoaded==totalimagesont){
开始不活动();
}
返回true;
}
})
.预加载();
}

请澄清问题的目的:a)加载不带缓存的图像b)在渲染前将图像预加载到缓存中c)您的选择?:)@ror b)在呈现列表之前将图像预加载到缓存中我在上面介绍的代码,您可以在任何地方使用。将其复制到您的SplashScreen,获取
postArrayList
,循环浏览
postArrayList
,并为每个图像调用上面显示的代码。您甚至可以从
应用程序
类中执行此操作。在
onBindViewHolder
中,您无需更改任何内容。如果您的图像已经加载并缓存,它们将立即显示。如果某些图像仍在加载,则加载速度会更快,因为下载已经在进行中。当加载到ImageView时,Glide的图像大小调整是正确的。如果下一次加载所需的大小等于或小于缓存图像的大小,则不应两次加载同一图像。看起来Glide实际上会缓存原始大小的图像,然后在需要时调整其大小。我会发布最新消息。让我们一起来。@PriyankaSingh,好的。
... 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();
}