Android Glide使用详解

60 篇文章 12 订阅
订阅专栏
45 篇文章 33 订阅
订阅专栏

目录

一、前言

1.1 Glide简介

1.2 Android SDK 要求

1.3 所需权限

1.3.1 网络加载

1.3.2 本地存储

1.4 性能

二、Glide基本用法

2.1 简单使用

三、Generated API(高级用法)

3.1 使用Generated API

3.2 定制请求

3.3 GlideExtension

GlideOption

四 、 高斯模糊(效果图)

4.1 简单使用

4.2 组合使用

4.3 GlideType

4.4 submit同步获取图片资源

五、Application Options(选项)

5.1 Memory cache(内存缓存)

5.2 Disk Cache(磁盘缓存)

5.3 Bitmap pool(位图池)

六、 配置缓存

6.1 磁盘缓存策略(Disk Cache Strategy)

6.2 仅从缓存加载图片

6.3 跳过缓存

6.4 清理磁盘缓存

七、相关资源

Glide 缓存机制及源码全解

Glide git传送门

Glide中文文档

glide-transformations传送门


一、前言

 Android上图片加载的解决方案有多种,比较流行的有ImageLoader,Picasso,Fresco,Glide。

  • ImageLoader 是很早的图片加载框架,支持图片下载进度的监听,支持View滚动过程中暂停加载。支持多种缓存策略比如最大先删除,最少使用先删除等。

  • Picasso 简洁轻量,支持图片缓存使用的监控,支持优先级处理,支持延迟加载,自己不参与本地缓存而是交给OkHttp去实现。

  • Fresco 框架较大,使用比较繁琐,支持Gif图片,支持流式显示,类似于网页模糊渐进式显示图片,两个内存缓存和一个Native缓存构建三级缓存。

  • Glide 支持拉取,解码和展示视频快照,图片,和GIF动画。支持优先级处理,与Activity和Fragment生命周期同步,图片默认是RGB_565,质量较差内存更小。功能更为丰富。

谷歌认可的是Glide,项目中用的最多的也是Glide。

1.1 Glide简介

        Glide 是一个快速高效的 Android 开源媒体管理和图像加载框架,它将媒体解码、内存和磁盘缓存以及资源池封装到一个简单易用的界面中。

        Glide 支持拉取,解码和展示视频快照,图片,和GIF动画

        Glide的Api十分灵活,开发者甚至可以插入和替换成自己喜爱的任何网络栈。默认情况下,Glide使用的是一个定制化的基于HttpUrlConnection的栈,但同时也提供了与Google Volley和Square OkHttp快速集成的工具库。

        虽然Glide 的主要目标是让任何形式的图片列表的滚动尽可能地变得更快、更平滑,但实际上,Glide几乎能满足你对远程图片的拉取/缩放/显示的一切需求。

1.2 Android SDK 要求

        最低 SDK 版本- Glide 要求最低 SDK 版本为14(Ice Cream Sandwich)或更高版本。

        编译 SDK 版本- Glide 必须针对 SDK 版本27 (Oreo MR1) 或更高版本进行编译。

1.3 所需权限

1.3.1 网络加载

        通过网络连接加载图像,你应该将INTERNETACCESS_NETWORK_STATE权限添加到你的AndroidManifest.xml:

<manifest>
    ...
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <!--允许Glide监视连接状态,并在用户从断开连接到已连接网络的状态。-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  ...
</manifest>

1.3.2 本地存储

        要从DCIM或图片等本地文件夹加载图像,你需要添加READ_EXTERNAL_STORAGE权限:

<manifest>
    ...
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  ...
</manifest>

        要将 Glide 的缓存存储在公共 sdcard 上,您需要使用 WRITE_EXTERNAL_STORAGE权限:

<manifest>
    ...
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  ...
</manifest>

1.4 性能

Glide 充分考虑了Android图片加载性能的两个关键方面:

  • 1.图片解码速度

  • 2.解码图片带来的资源压力

        为了让用户拥有良好的App使用体验,图片不仅要快速加载,而且还不能因为过多的主线程I/O或频繁的垃圾回收导致页面的闪烁和抖动现象。

Glide使用了多个步骤来确保在Android上加载图片尽可能的快速和平滑:

  • 自动、智能地下采样(downsampling)和缓存(caching),以最小化存储开销和解码次数;

  • 积极的资源重用,例如字节数组和Bitmap,以最小化昂贵的垃圾回收和堆碎片影响;

  • 深度的生命周期集成,以确保仅优先处理活跃的Fragment和Activity的请求,并有利于应用在必要时释放资源以避免在后台时被杀掉。

二、Glide基本用法

  • with 传入的可以是当前上下文的对象。

  • load 加载图片,图片可以是本地图片,应用资源的图片也可以是一张网络图片。

  • placeholder 占位符是在请求正在进行时,显示的图片。

  • error 当请求永久失败时,会显示设置图片。

  • into 传入要展示图片的控件。

  • transform 用来完成剪裁(切圆)或对位图应用过滤器,但它也可以用于转换GIF动画,甚至自定义的资源类型。

2.1 简单使用

        在build.gradle中添加依赖

implementation 'com.github.bumptech.glide:glide:4.12.0'

        加载图片

        Uri uri = Uri.parse("https://profile.csdnimg.cn/C/A/6/1_g984160547");
//        String uri = "https://profile.csdnimg.cn/C/A/6/1_g984160547";
        //上面两种写法效果相同
        Glide.with(this).load(uri).into(agb.ivInitial);
        //应用资源
        Glide.with(this).load(R.mipmap.sc1).into(agb.ivAppMipmap);
        //画圆
        Glide.with(this).load(uri).circleCrop().into(agb.ivCirclecrop);
        //增加占位符和加载失败显示图片
        Glide.with(this).load(uri).
                placeholder(R.mipmap.sc1)
                .error(R.mipmap.sc2)
                .into(agb.ivInitial);
        FutureTarget<Bitmap> target= Glide.with(this)
                .asBitmap()
                .load(uri)
                .submit();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Bitmap bitmap = target.get();//同步请求
                    //子线程切主线程更新UI
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            agb.ivOptions.setImageBitmap(bitmap);
                        }
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();

        取消加载

Glide.with(this).clear(agb.ivCirclecrop);

        注意: 尽管及时取消不必要的加载是很好的实践,但这并不是必须的操作。实际上,当 Glide.with() 中传入的 Activity 或 Fragment 实例销毁时,Glide 会自动取消加载并回收资源。

三、Generated API(高级用法)

        Glide v4 使用 注解处理器 (Annotation Processor) 来生成出一个 API,它允许应用扩展 Glide 的 API并包含各种集成库提供的组件。

Generated API 模式的设计出于以下两个目的: 

  • 1.集成库可以为 Generated API 扩展自定义选项。

  • 2.在 Application 模块中可将常用的方法组打包成一个选项在 Generated API 中使用

        虽然以上所说的工作均可以通过手动创建 RequestOptions 子类的方式来完成,但想将它用好更具有挑战,并且降低了 API 使用的流畅性。

3.1 使用Generated API

        1.在build.gradle中添加依赖

annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'

        2.创建一个添加有 @GlideModule 注解,继承自 AppGlideModule 的类。此类可生成出一个流式 API,内联了多种选项和集成库中自定义的选项:

@GlideModule
public class MyGlideModule extends AppGlideModule 
{

}

        3.生成的 API 默认名为 GlideApp ,与 AppGlideModule 的子类包名相同。在 Application 模块中将 Glide.with() 替换为 GlideApp.with(),即可使用该 API 去完成加载工作。

GlideApp.with(this).load(uri).circleCrop().into(agb.ivCirclecrop);

        Android Studio 在大多数时候都可以正确地处理注解处理器 (annotation processor) 和 generated API。然而,当你第一次添加你的 AppGlideModule 或做了某些类型的修改后,你可能需要重新构建 (rebuild) 你的项目。 如果你发现 API 没有被 import ,你可以通过以下方法重新构建:

  • 1.打开 Build 菜单;

  • 2.点击 Rebuild Project。

3.2 定制请求

        Glide 提供了许多可应用于单一请求的选项,包括变换、过渡、缓存选项等。

        1.默认选项可以直接应用于请求上:

 GlideApp.with(this).load(uri)
    .placeholder(R.mipmap.sc2)
    .error(R.mipmap.sc1)
    .override(150)
    .circleCrop().into(agb.ivOptions);

        2.通过 RequestOptions 类来在多个请求之间共享:

RequestOptions requestOptions = new RequestOptions().circleCrop()
.placeholder(R.mipmap.sc2)
.error(R.mipmap.sc1).override(150);
        GlideApp.with(this).load(uri).apply(requestOptions).into(agb.ivOptions);      
GlideApp.with(this).load(uri).apply(requestOptions).into(agb.ivCirclecrop);

3.3 GlideExtension

        Glide Generated API 可在 Application 和 Library 中被扩展。扩展使用被注解的静态方法来添加新的选项、修改现有选项、甚至添加额外的类型支持。

        被 @GlideExtension 注解的类应以工具类的思维编写。这种类应该有一个私有的、空的构造方法应为 final 类型,并且仅包含静态方法。被注解的类可以含有静态变量,可以引用其他的类或对象。

被 @GlideExtention 注解的类有两种扩展方式:

  • GlideOption - 为 RequestOptions 添加一个自定义的选项。

  • GlideType - 添加对新的资源类型的支持(GIF,SVG 等等)。

GlideOption

        1.创建一个添加有 @GlideExtension注解的类。此类可生成出一个流式 API,内联了多种选项和集成库中自定义的选项:

@GlideExtension
public final class MyGlideExtension {
    private MyGlideExtension(){}

    @GlideOption
    public static BaseRequestOptions<?> applyHeadScc(BaseRequestOptions<?> options,int size){
        return options.circleCrop()
                .override(size)
                .placeholder(R.mipmap.sc2)
                .error(R.mipmap.sc1);
    }
}

        2.这将在RequestOptions子类中生成一个如下所示的方法:

public class GlideOptions extends RequestOptions {
  
  /**
   * @see MyGlideExtension#applyHeadScc(BaseRequestOptions, int)
   */
  @SuppressWarnings("unchecked")
  @CheckResult
  @NonNull
  public GlideOptions applyHeadScc(int size) {
    return (GlideOptions) MyGlideExtension.applyHeadScc(this, size);
  }
  ...
}

        3.可以根据需要在方法中包含任意数量的附加参数,只要第一个参数始终为RequestOptions:

@GlideOption
    public static BaseRequestOptions<?> applyHeadScc(BaseRequestOptions<?> options,int size){
        return options.circleCrop()
                .override(size)
                .placeholder(R.mipmap.sc2)
                .error(R.mipmap.sc1);
}

        4.附加参数将作为参数添加到生成的方法中:

public GlideOptions applyHeadScc(int size) {
    return (GlideOptions) MyGlideExtension.applyHeadScc(this, size);
  }

        5.使用生成的GlideApp类调用你的自定义方法:

GlideApp.with(this)
  .load(uri)
  .applyHeadScc(150)
  .into(agb.ivOptions);

        带有GlideOption注释的方法应该是静态的并返回BaseRequestOptions< ? >注意: 生成的方法在标准Glide和RequestOptions类上不可用,只有Generated 的等效项可用。

四 、 高斯模糊(效果图)

使用库 传送门

implementation 'jp.wasabeef:glide-transformations:4.3.0'

4.1 简单使用

    
    public static void loadImageViewTransform(Context mContext,  byte[] path, ImageView mImageView) {
        //前一个值是圆角,后一个值是模糊程度,越大越模糊
        BlurTransformation blurTransformation = new BlurTransformation(10,15);
        Glide.with(mContext).load(path)
                .apply(RequestOptions.bitmapTransform(blurTransformation))
                .into(mImageView);
    }

4.2 组合使用

    @GlideOption
    public static BaseRequestOptions<?> applyBlurHeadScc(BaseRequestOptions<?> options,int size){
        //高斯模糊
        BlurTransformation blurTransformation = new BlurTransformation(20,1);
        //下面是高斯模糊+切圆组合Transformation
        return options
                .override(size)
                .placeholder(R.mipmap.sc2)
                .error(R.mipmap.sc1)
//                .circleCrop()
//                .transform(blurTransformation);
//      .transform(blurTransformation,new CircleCrop());
                .transform(new MultiTransformation<>(blurTransformation,new CircleCrop()));
}

        注意: 默认情况下,对每一个后续呼叫transform()或任何特定的transform方法(fitCenter(),centerCrop(),bitmapTransform()等)将取代先前的transform。

        要将多个转换应用于单个加载,请使用MultiTransformation类或快捷 .transforms() 方法。

        2.自定义Transformation 你也可以继承BitmapTransformation,重写transform方法,下面贴出glide-transformations里面的BlurTransformation类,一起学习一下。

public class BlurTransformation extends BitmapTransformation {

  private static final int VERSION = 1;
  private static final String ID =
    "jp.wasabeef.glide.transformations.BlurTransformation." + VERSION;

  private static final int MAX_RADIUS = 25;
  private static final int DEFAULT_DOWN_SAMPLING = 1;

  private final int radius;
  private final int sampling;

  public BlurTransformation() {
    this(MAX_RADIUS, DEFAULT_DOWN_SAMPLING);
  }

  public BlurTransformation(int radius) {
    this(radius, DEFAULT_DOWN_SAMPLING);
  }

  public BlurTransformation(int radius, int sampling) {
    this.radius = radius;
    this.sampling = sampling;
  }

  @Override
  protected Bitmap transform(@NonNull Context context, @NonNull BitmapPool pool,
                             @NonNull Bitmap toTransform, int outWidth, int outHeight) {

    int width = toTransform.getWidth();
    int height = toTransform.getHeight();
    int scaledWidth = width / sampling;
    int scaledHeight = height / sampling;

    Bitmap bitmap = pool.get(scaledWidth, scaledHeight, Bitmap.Config.ARGB_8888);

    setCanvasBitmapDensity(toTransform, bitmap);

    Canvas canvas = new Canvas(bitmap);
    canvas.scale(1 / (float) sampling, 1 / (float) sampling);
    Paint paint = new Paint();
    paint.setFlags(Paint.FILTER_BITMAP_FLAG);
    canvas.drawBitmap(toTransform, 0, 0, paint);

    try {
      bitmap = RSBlur.blur(context, bitmap, radius);
    } catch (RSRuntimeException e) {
      bitmap = FastBlur.blur(bitmap, radius, true);
    }

    return bitmap;
  }

  @Override
  public String toString() {
    return "BlurTransformation(radius=" + radius + ", sampling=" + sampling + ")";
  }

  @Override
  public boolean equals(Object o) {
    return o instanceof BlurTransformation &&
      ((BlurTransformation) o).radius == radius &&
      ((BlurTransformation) o).sampling == sampling;
  }

  @Override
  public int hashCode() {
    return ID.hashCode() + radius * 1000 + sampling * 10;
  }

  @Override
  public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {
    messageDigest.update((ID + radius + sampling).getBytes(CHARSET));
  }
}

4.3 GlideType

        GlideType带注释的静态方法扩展RequestManager。GlideType带注释的方法允许您添加对新类型的支持,包括指定默认选项。

        1.例如,要添加对 GIF 的支持(选择资源类型),你可以添加一个GlideType方法:

    @GlideType(GifDrawable.class)
    public static RequestBuilder<GifDrawable> scGif(RequestBuilder<GifDrawable> requestBuilder) {
        return requestBuilder
                .transition(new DrawableTransitionOptions())
                .apply(decodeTypeOf(GifDrawable.class).lock());
}

        方法名为什么叫scGif,而不是asGif,因为GlideRequests中已经有一个asGif方法。

        2.将在GlideRequests生成一个如下所示的方法:

public class GlideRequests extends RequestManager {
  public GlideRequest<GifDrawable> scGif() {
    return (GlideRequest<GifDrawable>) MyGlideExtension.scGif(this.as(GifDrawable.class));
  }
  ...
}

        3.使用生成的GlideApp类来调用您的自定义类型(选择资源类型):

        GlideApp.with(this)
                .scGif()
                .load(uri)
                .applyBlurHeadScc(150)
                .addListener(new RequestListener<GifDrawable>() {
                    @Override
                    public boolean onLoadFailed(GlideException e, Object model, Target<GifDrawable> target, boolean isFirstResource) {
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) {
                        return false;
                    }
                })
                .into(agb.ivCirclecrop);

        RequestListener 返回的类型为你scGif设置的GifDrawable 相对应。

4.4 submit同步获取图片资源

FutureTarget<Bitmap> target= GlideApp.with(this)
                .asBitmap()
                .load(uri)
                .applyBlurHeadScc(150)
                .submit();
        //因target.get()是同步请求
        //所以用线程转异步请求
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Bitmap bitmap = target.get();//同步请求
                    //子线程切主线程更新UI
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            agb.ivOptions.setImageBitmap(bitmap);
                        }
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();

        效果跟之前的一样一样的。 这个功能就是有特殊需求时对获取的图片进行特殊处理。

五、Application Options(选项)

        Glide 允许应用通过 AppGlideModule 实现来完全控制 Glide 的内存和磁盘缓存使用。Glide 试图提供对大部分应用程序合理的默认选项,但对于部分应用,可能就需要定制这些值。在你做任何改变时,请注意测量其结果,避免出现性能的倒退。

5.1 Memory cache(内存缓存)

        默认情况下,Glide使用 LruResourceCache ,这是 MemoryCache 接口的一个缺省实现,使用固定大小的内存和 LRU 算法。LruResourceCache 的大小由 Glide 的 MemorySizeCalculator 类来决定,这个类主要关注设备的内存类型,设备 RAM 大小,以及屏幕分辨率。

        1.自定义 MemoryCache 的大小,具体是在它们的 AppGlideModule 中使用 applyOptions(Context, GlideBuilder) 方法配置 MemorySizeCalculator:

@GlideModule
public class MyGlideModule extends AppGlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        MemorySizeCalculator calculator = new MemorySizeCalculator.Builder(context)
                .setMemoryCacheScreens(2)
                .build();
        builder.setMemoryCache(new LruResourceCache(calculator.getMemoryCacheSize()));
    }
}

        2.直接覆盖缓存大小:

@GlideModule
public class MyGlideModule extends AppGlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        int memoryCacheSizeBytes = 1024 * 1024 * 10; // 10mb
        builder.setMemoryCache(new LruResourceCache(memoryCacheSizeBytes));
    }
}

        3.提供自己的 MemoryCache 实现:

@GlideModule
public class MyGlideModule extends AppGlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        builder.setMemoryCache(new MyMemoryCacheImpl());
    }
}

5.2 Disk Cache(磁盘缓存)

        Glide 使用 DiskLruCacheWrapper 作为默认的磁盘缓存。 DiskLruCacheWrapper 是一个使用 LRU 算法的固定大小的磁盘缓存。默认磁盘大小为 250 MB ,位置是在应用的 缓存文件夹 中的一个 特定目录

        1.如果显示的媒体是公开的(从未经身份验证的网站、搜索引擎等获取),则应用程序可以将位置更改为外部存储:

@GlideModule
public class MyGlideModule extends AppGlideModule {
  @Override
  public void applyOptions(Context context, GlideBuilder builder) {
    builder.setDiskCache(new ExternalCacheDiskCacheFactory(context));
  }
}

        2.无论使用内部或外部磁盘缓存,应用程序都可以改变磁盘缓存的大小:

@GlideModule
public class MyGlideModule extends AppGlideModule {
  @Override
  public void applyOptions(Context context, GlideBuilder builder) {
    int diskCacheSizeBytes = 1024 * 1024 * 100; // 100 MB
    builder.setDiskCache(new InternalCacheDiskCacheFactory(context, diskCacheSizeBytes));
  }
}

        3.应用程序还可以改变缓存文件夹在外存或内存上的名字:

@GlideModule
public class MyGlideModule extends AppGlideModule {
  @Override
  public void applyOptions(Context context, GlideBuilder builder) {
    int diskCacheSizeBytes = 1024 * 1024 * 100; // 100 MB
    builder.setDiskCache(
        new InternalCacheDiskCacheFactory(context, "cacheFolderName", diskCacheSizeBytes));
  }
}

        4.应用程序还可以自行选择 DiskCache 接口的实现,并提供自己的 DiskCache.Factory 来创建缓存。Glide 使用一个工厂接口来在后台线程中打开 磁盘缓存 ,这样方便缓存做诸如检查路径存在性等的IO操作而不用触发 严格模式 。

@GlideModule
public class MyGlideModule extends AppGlideModule {
  @Override
  public void applyOptions(Context context, GlideBuilder builder) {
    builder.setDiskCache(new DiskCache.Factory() {
        @Override
        public DiskCache build() {
          return new MyCustomDiskCache();
        }
    });
  }
}

5.3 Bitmap pool(位图池)

        Glide 使用 LruBitmapPool 作为默认的 BitmapPool 。LruBitmapPool 是一个内存中的固定大小的 BitmapPool,使用 LRU 算法清理。默认大小基于设备的分辨率和密度,同时也考虑内存类和 isLowRamDevice 的返回值。具体的计算通过 Glide 的 MemorySizeCalculator 来完成,与 Glide 的 MemoryCache 的大小检测方法相似。

        1.可以在它们的 AppGlideModule 中定制 BitmapPool 的尺寸,使用 applyOptions(Context, GlideBuilder) 方法并配置 MemorySizeCalculator:

@GlideModule
public class MyGlideModule extends AppGlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        MemorySizeCalculator calculator = new MemorySizeCalculator.Builder(context)
                .setBitmapPoolScreens(3)
                .build();
        builder.setBitmapPool(new LruBitmapPool(calculator.getBitmapPoolSize()));
    }
}

        2.直接复写这个池的大小:

@GlideModule
public class MyGlideModule extends AppGlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        int bitmapPoolSizeBytes = 1024 * 1024 * 30; // 30mb
        builder.setBitmapPool(new LruBitmapPool(bitmapPoolSizeBytes));
    }
}

        3.提供自己的BitmapPool实现:

@GlideModule
public class MyGlideModule extends AppGlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        builder.setBitmapPool(new MyBitmapPoolImpl());
    }
}

六、 配置缓存

6.1 磁盘缓存策略(Disk Cache Strategy)

        DiskCacheStrategy 可被 diskCacheStrategy 方法应用到每一个单独的请求。 目前支持的策略允许你阻止加载过程使用或写入磁盘缓存,选择性地仅缓存无修改的原生数据,或仅缓存变换过的缩略图,或是兼而有之。

指定 DiskCacheStrategy 非常容易:

    Glide.with(this)
            .load(uri)
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .into(imageView);

一个 diskCacheStrategy() 方法就可以调整他的硬盘缓存策略。其中可以传入的参数有五种:

  • DiskCacheStrategy.AUTOMATIC :表示对于本地数据,AUTOMATIC 策略则会仅存储变换过的缩略图;远程数据(Uri下载)仅会存储未被你的加载过程修改过(比如:变换、裁剪)的原始数据(默认选项)。

  • DiskCacheStrategy.NONE: 表示不缓存任何内容。

  • DiskCacheStrategy.DATA: 表示只缓存原始图片。

  • DiskCacheStrategy.RESULT: 表示只缓存转换过后的图片。

  • DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片。

6.2 仅从缓存加载图片

        某些情形下,你可能希望只要图片不在缓存中则加载直接失败(省流量?)。如果要完成这个目标,你可以在单个请求的基础上使用 onlyRetrieveFromCache 方法:

Glide.with(this)
        .load(uri)
        .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
        .onlyRetrieveFromCache(true);
        .into(imageView);

        如果图片在内存缓存或在磁盘缓存中,它会被展示出来。否则只要这个选项被设置为 true ,这次加载会视同失败。

6.3 跳过缓存

        如果你想确保一个特定的请求跳过磁盘和/或内存缓存(比如:图片验证码),Glide 也提供了一些替代方案。

        仅跳过内存缓存,请使用 skipMemoryCache() :

Glide.with(fragment)
  .load(url)
  .skipMemoryCache(true)
  .into(imageView);

        仅跳过磁盘缓存,请使用 DiskCacheStrategy.NONE :

Glide.with(fragment)
  .load(url)
  .diskCacheStrategy(DiskCacheStrategy.NONE)
  .into(imageView);

        以上两个选项可以同时使用:

Glide.with(fragment)
  .load(url)
  .diskCacheStrategy(DiskCacheStrategy.NONE)
  .skipMemoryCache(true)
  .into(imageView);

        虽然提供了这些办法让你跳过缓存,但你通常应该不会想这么做。从缓存中加载一个图片,要比拉取-解码-转换成一张新图片的完整流程快得多。

6.4 清理磁盘缓存

        要尝试清理所有磁盘缓存条目,你可以使用 clearDiskCache

new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    // 必须在子线程上调用此方法。
                    Glide.get(AppGlobalUtils.getApplication()).clearDiskCache();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();

七、相关资源

Glide 缓存机制及源码全解

Glide git传送门

Glide中文文档

glide-transformations传送门

        glide-transformations:一个 Android 转换库,为Glide提供各种图像转换。下面是效果图:

        以上内容看完Glide的基本使用肯定是没问题的,如有问题,烦请指正。想要了解更多可以通过下面的传送门自行查看。后面会有一篇文章专门来介绍Glide缓存机制,嘿嘿嘿。大家一起加油。

Android Glide 的简单使用(一),Android面试题及答案
m0_64383081的博客
12-15 4073
深度的生命周期集成,以确保仅优先处理活跃的Fragment和Activity的请求,并有利于应用在必要时释放资源以避免在后台时被杀掉。 Glide基本用法 ========= with 传入的可以是当前上下文的对象。 load 加载图片图片可以是本地图片,应用资源的图片也可以是一张网络图片。 placeholder 占位符是在请求正在进行时,显示的图片。 error 当请求永久失败时,会显示设置图片。 into 传入要展示图片的控件。 transform 用来完成剪裁(切圆).
Android Glide 4.0+使用详解
08-27
Android Glide 4.0+使用详解 Android Glide 是一个功能强大且流行的图片加载库,能够帮助开发者快速加载图片和视频。在 Android 平台上,Glide 是一个非常流行的选择,许多开发者都在使用它。今天,我们将详细介绍...
Android——Glide使用详解
小欣儿的专栏
04-18 5876
Glide是谷歌为我们推荐的一个图片加载库。为什么要选择使用Glide呢? 1、代码有人维护,不至于出现问题,项目组都搞不定的时候问题无法解决。(ImageLoader已没人维护了) 2、代码简洁,可读性很好。(Fresco是一个非常优秀的库,但是配置稍显麻烦,同时代码风格读起来有些生疏) 3、功能强大(400多k的包,包含很多功能,例如:像加载Gif图片就是Picasso做不到的) 下面我们就来
Glide Transformations 项目教程
最新发布
gitblog_00451的博客
08-09 947
Glide Transformations 项目教程 glide-transformationsAn Android transformation library providing a variety of image transformations for Glide.项目地址:https://gitcode.com/gh_mirrors/gl/glide-transformations 1...
AndroidGlide使用
晨曦的博客
04-10 8310
第1章 Glide使用 1.1 Glide的概述 Glide,就像 Picasso,可以从多个源去加载和显示图片,同时也兼顾缓存和在做图片处理的时候维持一个低内存消耗。它已经在 Google 官方 APP (如 Google 2015开发者大会的应用程序)中使用了,就和 Picasso 一样受欢迎。 1.2 Glide的引入 1.2.1 Glide的配置 在AndroidMainFest.xml中添加以下代码: dependencies { implementation 'com
Android图片加载框架Glide使用总结
weixin_30701521的博客
02-29 88
时间:2016年2月29日14:47:46目录: 使用Glide结合列表的样式进行图片加载 如果使用的是RecyclerView,可以在Adapter的onBindViewHolder方法中使用加载网络图片时,由于加载过程中图片未能及时显示,此时可能需要设置等待时的图片,通过placeHolder()方法 当加载图片失败时,通过error(Drawable drawab...
Android Glide使用
ElevenDGQ的博客
07-30 728
https://muyangmin.github.io/glide-docs-cn/doc/download-setup.html https://github.com/bumptech/glide https://github.com/bumptech/glide/tree/v3.7.0 AS 引用 dependencies {                            c...
Android--Glide的基本使用
本人随手记录,内容只是个人看懂程度,对内容有任何疑问请勿打扰
03-08 473
有一点要注意的就是,高版本不支持http明文。所以地址要写https 简单使用,点击按钮,执行各种方法。例子: //加载网络图片 public void one(View view) { Glide.with(this).load("https://seopic.699pic.com/photo/50008/9194.jpg_wh1200.jpg")...
Android---Glide的基本使用
qq_44950283的博客
05-09 7671
Glide 是一个快速高效的 Android 图片加载库,可以自动加载网络、本地文件,app 资源中的图片,注重于平滑的滚动。
AndroidGlide获取图片Path、Bitmap用法详解
08-28
AndroidGlide 获取图片 Path、Bitmap 用法详解Android 开发中,加载图片是一个非常常见的需求,而 Glide 是一个非常流行的图片加载框架。今天,我们将详细介绍如何使用 Glide 获取图片的 Path 和 Bitmap。 ...
Android框架学习之Volley和Glide详解
01-06
该框架封装的扩展性很强,支持OkHttp,Volley里面也封装了ImageLoader,自身作为图片加载框架,不过这块功能没有一些专门的图片加载框架强大,对于简单的需求可以使用,对于稍复杂点的需求还是需要用到专门的图片...
Android图片加载Glide使用详解
yzpbright的博客
12-01 181
参考: Android图片加载库:最全面解析Glide用法
Android Glide使用总结
Wman
02-23 3831
Android Glide使用总结初识在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide图片加载库,作者是bumptech。这个库被广泛的运用在google的开源项目中,包括2014年google I/O大会上发布的官方app。之前很多同学都看到过这篇介绍Glide的文章,原文在这里。文中从各个方面介绍和比较了Glide与Picasso,总体来说二者极为相似,有着近乎相同的A
android Glide使用
Anthonybuer的博客
12-06 612
1.引用Glide的地址https://github.com/bumptech/glide 2.配置Glide  compile 'com.github.bumptech.glide:glide:4.6.1' annotationProcessor 'com.github.bumptech.glide:compiler:4.6.1' 3.使用 最简单的使用方法 Glide.with(mConte...
androidglide使用
honey_小程序媛的博客
07-17 608
谷歌为我们介绍了一个名叫 Glide图片加载库,作者是bumptech。这个库被广泛的运用在google的开源项目中,包括2014年google I/O大会上发布的官方app这篇文章参考了一些网络上总结的glide使用,还有google 的 Picasso和Glide都在jcenter上。在项目中添加依赖非常简单: 注意,这是在V4包下才能用的dependencies { c
android glide使用代码
bjxiaxueliang的CODING技术小馆
10-13 481
Glide GitHub地址:https://github.com/bumptech/glide我的使用代码public class GlideUtils { private static final String TAG = GlideUtils.class.getSimpleName(); /** * 停止请求 * * @param context
安卓开发中的Glide库的使用
m0_66843126的博客
06-27 1518
是一个功能强大的工具,它允许对加载图片进行各种变换处理。使用方式:首先调用 Glide.with(context),然后指定要加载图片资源,最后调用 into(imageView) 将图片设置到 ImageView。更新 ID:如果你想要 Glide 缓存经过此变换的图片,你需要重写 equals 和 hashCode 方法,以确保不同的变换实例能被正确识别。android.permission.WRITE_EXTERNAL_STORAGE:允许应用程序写入存储在外部存储上的文件,例如SD卡。
android Glide使用
06-07
Glide 是一款专注于图片加载Android 库,使用 Glide 可以方便地加载图片、GIF 动态图片和视频等。下面是 Glide使用步骤: 1. 在 build.gradle 文件中添加依赖: ```groovy dependencies { implementation 'com.github.bumptech.glide:glide:4.12.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0' } ``` 2. 在布局文件中添加 ImageView 控件: ```xml <ImageView android:id="@+id/image_view" android:layout_width="match_parent" android:layout_height="match_parent"/> ``` 3. 在代码中使用 Glide 加载图片: ```java Glide.with(context) .load("https://www.example.com/image.jpg") .placeholder(R.drawable.placeholder) // 加载中显示的图片 .error(R.drawable.error) // 加载失败显示的图片 .into(imageView); ``` 其中,`with` 方法用于获取 Glide 实例,`load` 方法用于指定图片的 URL 或本地路径,`placeholder` 方法用于加载中显示的图片,`error` 方法用于加载失败显示的图片,`into` 方法用于将图片加载到 ImageView 控件中。 除了以上基本用法,Glide 还支持更多功能,比如设置图片大小、缓存策略、动态加载等,详情可参考 Glide 的官方文档。
写文章

热门文章

  • C语言基础知识梳理总结 112438
  • Android Studio模拟器(AVD)安装 33788
  • Android TextView 使用以及属性(方法)大全 31614
  • Android The emulator process for AVD XXX has terminated. 21605
  • Google Pay支付遇到的问题 21300

分类专栏

  • Android SDK接入疑难杂症 付费 14篇
  • Android 实战进阶 23篇
  • Android 随手笔录 60篇
  • Android 基础梳理 45篇
  • 系统架构设计师(新版) 62篇
  • 系统架构师案例分析 25篇
  • HarmonyOS 4篇
  • Material Design 6篇
  • Kotlin 初学者 18篇
  • Flutter 6篇
  • 面试题 11篇
  • 前端 6篇
  • 命令行 3篇
  • Java 基础 17篇
  • WebView 5篇
  • C语言基础 6篇
  • Android Studio 19篇
  • Android 国内SDK接入 6篇

最新评论

  • 基于 Web 的工业设备监测系统:非功能性需求与标准化数据访问机制的架构设计

    帅次C: 从理论到实践,从问题到解决方案,这篇博客全面而系统地展示了技术的魅力,让人读后意犹未尽,回味无穷。

  • 基于 Web 的工业设备监测系统:非功能性需求与标准化数据访问机制的架构设计

    小码农叔叔: 博主的文字如同一首美妙的乐曲,总是能触动我的心弦,你的博客内容充满启发,每次都让我对新领域有更多的兴趣,每一篇博文都是一次心灵的提升,你的分享总是如此珍贵,期待你的不断创作。感谢你的精彩分享。

  • 跨国公司撤出背后的启示:中国IT产业的挑战与机遇

    wheel down ~~: 博文作者真是一位出色的写手!这篇博文让我受益匪浅,语言简洁明了,逻辑严谨有序。作者不仅运用了丰富的例子和引文,为观点提供了充分的支持和验证,还以其独特的视角带给读者全新的思考。

  • 采用 Redis+数据库为某互联网文化公司建立网上社区平台

    TANGLONG_little: 这篇博文写得真是太棒了!作者的用词准确、流畅,让我迅速被吸引。文章的结构紧凑,逻辑清晰,让我能够轻松地理解作者的思路。此外,作者还通过丰富的例子和引文,为观点提供了充分的支持和论证。

  • ADB 安装教程:如何在 Windows、macOS 和 Linux 上安装 Android Debug Bridge

    TANGLONG_little: 博主的文章一直都是我的学习指南,内容详实,让我从中获益良多,每篇博文都是知识的瑰宝,我真的很喜欢你的风格,你的博客内容深入浅出,总是让我不再感到学习的困难,期待你的下一次精彩分享。

最新文章

  • 基于 Web 的工业设备监测系统:非功能性需求与标准化数据访问机制的架构设计
  • ADB 安装教程:如何在 Windows、macOS 和 Linux 上安装 Android Debug Bridge
  • 采用 Redis+数据库为某互联网文化公司建立网上社区平台
2024
09月 14篇
08月 36篇
07月 31篇
06月 16篇
05月 1篇
03月 6篇
02月 2篇
01月 8篇
2023年29篇
2022年11篇
2021年109篇
2020年5篇
2018年7篇
2017年34篇
2016年6篇

目录

目录

评论 44
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅次

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家大理玻璃钢卡通雕塑定制清远玻璃钢动物雕塑费用是多少泡沫玻璃钢卡通雕塑定做浙江商业商场美陈销售企业虎年吉祥物玻璃钢雕塑商场室外美陈照片鹤壁专业玻璃钢雕塑延安小区玻璃钢雕塑安装广州玻璃钢人物雕塑销售厂人物雕像玻璃钢雕塑厂家工厂金华玻璃钢雕塑厂新郑公园景观玻璃钢卡通雕塑厂家商丘玻璃钢不锈钢雕塑广东玻璃钢抽象艺术雕塑摆件松江区镜面玻璃钢雕塑哪家好宁波邢台玻璃钢卡通雕塑南阳玻璃钢仿真雕塑玻璃钢雕塑全过程无锡玻璃钢雕塑制作厂家宁波人物玻璃钢雕塑多少钱福州玻璃钢雕塑定制宁波玻璃钢雕塑定制价格公园标识玻璃钢彩绘雕塑定做柳州仿铜玻璃钢雕塑生产厂家云南公园玻璃钢雕塑供应商莆田小区玻璃钢雕塑生产厂家河南抽象玻璃钢雕塑设计云南玻璃钢雕塑厂家直供济源玻璃钢镂空雕塑厂家汕尾玻璃钢雕塑怎么样香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化