使用 Glide 预加载多个图像

新手上路,请多包涵

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

我们尝试了什么:

 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 imageView,但结果是一样的:

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

原文由 An-droid 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
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);
}

原文由 Sakchham 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

  1. 使用 downloadOnly 方法,如果你想从网上下载图像并将它们存储在 diskCache 中:
    FutureTarget<File> future = Glide.with(applicationContext)
       .load(yourUrl)
       .downloadOnly(500, 500);

  1. 如果要将它们加载到内存缓存中,请使用 preload 方法。
    Glide.with(context)
           .load(url)
           .preload(500, 500);

您稍后可以使用缓存的图像

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


原文由 Vinay W 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题