使用滑动预加载多张图片

2022-09-01 00:00:27

我们正在尝试将图像预加载到缓存内存中,以便稍后加载它们(图像位于应用程序的Asset文件夹中

我们尝试了什么:

Glide.with(this)
    .load(pictureUri)
    .diskCacheStrategy(DiskCacheStrategy.ALL);

Glide.with(this)
    .load(picture_uri)
    .diskCacheStrategy(DiskCacheStrategy.ALL)
    .preload();

问题:只有当我们尝试加载/显示图像时,才会缓存图像:它们必须先加载到内存中,以便它们显示得更快。

Glide.with(this)
    .load(picture_uri)
    .into(imageView);

我们还尝试使用 GlideModule 来增加 CacheMemory 大小:

public class GlideModule implements com.bumptech.glide.module.GlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder
        builder.setMemoryCache(new LruResourceCache(100000));
    }

    @Override
    public void registerComponents(Context context, Glide glide) {
    }
}

在清单中:

 <meta-data android:name=".GlideModule" android:value="GlideModule"/>

到目前为止,没有任何工作。有什么想法吗?


我们尝试使用不可见的 1 dp 图像视图,但结果是相同的:

for(Drawing drawing: getDrawingsForTab(tab)){

    Glide.with(this)
            .load(drawing.getImage().toUri())
            .dontAnimate()
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .into(mPreloadCacheIv);

    for(Picture picture : getPictures()){

        Glide.with(this)
                .load(picture.getPicture().toUri())
                .dontAnimate()
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(mPreloadCacheIv);
    }
}

答案 1

使用以下代码缓存图像而不显示它们

  1. 如果您希望从 Web 下载图像并将其存储在 diskCache 中,请使用该方法:downloadOnly

    FutureTarget<File> future = Glide.with(applicationContext)
        .load(yourUrl)
        .downloadOnly(500, 500);
    
  2. 如果要将它们加载到内存缓存中,请使用方法。preload

    Glide.with(context)
            .load(url)
            .preload(500, 500);
    

稍后可以使用缓存的图像

Glide.with(yourFragment)
    .load(yourUrl)
    .into(yourView);


答案 2

最好的选择是自己处理缓存,它给你更多的控制,应该很容易,因为你已经知道要加载什么位图。

首先:设置 LruCache

LruCache<String, Bitmap> memCache = new LruCache<>(size) {
    @Override
    protected int sizeOf(String key, Bitmap image) {
        return image.getByteCount()/1024;
    }
};

第二:将位图加载到 LruCache

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x; //width of screen in pixels
int height = size.y;//height of screen in pixels
Glide.with(context)
    .load(Uri.parse("file:///android_asset/imagefile"))
    .asBitmap()
    .fitCenter() //fits given dimensions maintaining ratio
    .into(new SimpleTarget(width,height) {
        // the constructor SimpleTarget() without (width, height) can also be used.
        // as suggested by, An-droid in the comments
        @Override
        public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
            memCache.put("imagefile", resource);
        }
    });

第三:使用缓存的位图

Bitmap image = memCache.get("imagefile");
if (image != null) {
    //Bitmap exists in cache.
    imageView.setImageBitmap(image); 
} else {
    //Bitmap not found in cache reload it 
    Glide.with(context)
         .load(Uri.parse("file:///android_asset/imagefile"))
         .into(imageView);
}

推荐