通过滑动同步加载图像并将其缓存在磁盘中

时间:2017-01-07 11:39:54

标签: android android-glide

我正在做这样的事情来同步获取位图并使用imageView.setImageBitmap(bitmap)将其设置为图像;

return Glide
    .with(mContext)
    .load(url)
    .asBitmap()
    .into(width, height)
    .get();

我需要同步执行,因为我在AsyncTask的doInBackground中执行此操作。我需要从后端获取图像URL,然后再加载滑动。后来我直接用滑动加载相同的url到视图中。 问题是图像没有缓存在磁盘中。对此有何解决方案?

3 个答案:

答案 0 :(得分:1)

diskCacheStrategy添加到您的Glide,选择策略类型为来源

您可以了解为何使用此link

中的SOURCE

DiskCacheStrategy.NONE没有任何内容,正如所讨论的那样

DiskCacheStrategy.SOURCE仅缓存原始的全分辨率图像。

在降低分辨率(以及可能的转换)后,

DiskCacheStrategy.RESULT仅缓存最终图像(默认行为)

DiskCacheStrategy.ALL缓存图像的所有版本

尝试: 从URL获取位图:

return Glide
    .with(mContext)
    .load(url)
    .asBitmap()
    .diskCacheStrategy(DiskCacheStrategy.SOURCE)
    .into(width, height)
    .get();

在ImageView中加载:

       Glide
        .with(mContext)
        .load(url)
        .diskCacheStrategy(DiskCacheStrategy.SOURCE)
        .into(imageView) // your ImageViewID here

获取Bitmap后将Image加载到ImageView中:

   Glide.with(context)
        .load(url)
        .asBitmap()
        .diskCacheStrategy(DiskCacheStrategy.SOURCE)
        .into(new SimpleTarget<Bitmap>() {
            @Override
            public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                iv_image.setImageBitmap(resource); // you can store resource to some variable too if you want to update more than 1 images or try it like iv_image2.setImageBitmap(resource)
                iv_image.requestLayout();
            }
        });

答案 1 :(得分:0)

使用diskCacheStrategy

return Glide
    .with(mContext)
    .load(url)
    .asBitmap()
    .diskCacheStrategy(DiskCacheStrategy.ALL)
    .into(width, height)
    .get();

答案 2 :(得分:0)

我多次遇到这个问题,克服它的最好方法是在 glide CustomTarget

中获取数据后使用接口加载数据

创建一个名为 OnglideLoaded.java 的新文件,如下所示:

import android.graphics.drawable.Drawable;

public interface OnGlideLoaded {
    void onGlideLoaded(Drawable drawable);
}

现在为它创建 setter 方法,就像 glide 所在的位置:

public void setOnGlideLoaded(OnGlideLoaded onGlideLoaded) {
    this.onGlideLoaded = onGlideLoaded;
}

不要在 Glide Target 中调用它:

Glide.with(context)
     .asBitmap()
     .load(uri)
     .into(new CustomTarget<Bitmap>() {
           @Override
           public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                 icon = resource;
                 if (onGlideLoaded!=null){
                        //This will send the image to every registered interface
                        onGlideLoaded.onGlideLoaded(icon);
                 }
           }

           @Override
           public void onLoadCleared(@Nullable Drawable placeholder) {

           }
});

现在像这样在你想要图像的地方调用接口:

reference.setOnGlideLoaded(new OnGlideLoaded() {
    @Override
    public void onGlideLoaded(Drawable drawable) {
        imageView.setImageBitmap(drawable);
    }
});
<块引用>

在这里,引用将是您创建 setter 方法的对象。