[TOC]
集成
dependencies {
implementation 'com.github.bumptech.glide:glide:4.5.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.5.0'
}
V4增加了Generated API
@(Android 三方库)GlideModule
public class MyAppGlideModule extends AppGlideModule {
}
自定义一个继承于AppGlideModule的类,并在该类前使用GlideModule注解.然后我们重新build一下项目.就可以使用GlideApp了
GlideApp.with(activity).asBitmap().load(path).override(width,height).fitCenter().into(imageView);
GlideExtension
Glide扩展:使用被注解的静态方法来添加新的选项、修改现有选项、甚至添加额外的类型支持
被 @GlideExtention 注解的类有两种扩展方式:
- GlideOption - 为 RequestOptions 添加一个自定义的选项。
- GlideType - 添加对新的资源类型的支持(GIF,SVG 等等)。
@GlideOption
用 @GlideOption 注解的静态方法用于扩展 RequestOptions
@GlideExtension
public class MyAppExtension {
/**
* Size of mini thumb in pixels.
*/
private static final int MINI_THUMB_SIZE = 100;
private MyAppExtension() {
}
@GlideOption
public static void miniThumb(RequestOptions options) {
options.fitCenter().override(MINI_THUMB_SIZE);
}
}
需要注意的是里面的构造方法必须是私有的,如果定义为public编译会报错:
Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
> java.lang.IllegalArgumentException: RequestOptionsExtensions must be public, with private constructors and only static methods. Found a non-private constructor
这种类应该有一个私有的、空的构造方法,应为 final 类型,并且仅包含静态方法。被注解的类可以含有静态变量,可以引用其他的类或对象。
编译后在GlideOption中会自动添加扩展的miniThumb方法:
/**
* Automatically generated from {@link com.bumptech.glide.annotation.GlideExtension} annotated classes.
*
* @see RequestOptions
* @see MyAppExtension
*/
@SuppressWarnings("deprecation")
public final class GlideOptions extends RequestOptions implements Cloneable {
/**
* @see MyAppExtension#miniThumb(RequestOptions)
*/
@NonNull
@CheckResult
public GlideOptions miniThumb() {
if (isAutoCloneEnabled()) {
return clone().miniThumb();
}
MyAppExtension.miniThumb(this);
return this;
}
/**
* @see MyAppExtension#miniThumb(RequestOptions)
*/
@CheckResult
public static GlideOptions miniThumbOf() {
return new GlideOptions().miniThumb();
}
}
此时我们就可以直接使用扩展的选项:
GlideApp.with(this)
.asBitmap()
.load("")
.miniThumb()
.submit(0, 0);
@GlideType
被 @GlideType 注解的方法允许你添加对新的资源类型的支持,包括指定默认选项。
private static final RequestOptions DECODE_TYPE_GIF =RequestOptions.decodeTypeOf(GifDrawable.class).lock();
@GlideType(GifDrawable.class)
public static void asMyGif(RequestBuilder<GifDrawable> requestBuilder){
requestBuilder.transition(new DrawableTransitionOptions()).apply(DECODE_TYPE_GIF);
}
rebuild一下,然后使用自定义的资源类型了
GlideApp.with(this)
.asMyGif()
.load("")
.miniThumb()
.submit(0, 0);
此时自动在GlideRequests中添加了asMyGif:
/**
* @see MyAppExtension#asMyGif(RequestBuilder)
*/
@NonNull
@CheckResult
public GlideRequest<GifDrawable> asMyGif() {
GlideRequest<GifDrawable> requestBuilder = this.as(GifDrawable.class);
MyAppExtension.asMyGif(requestBuilder);
return requestBuilder;
}
占位符
总共分三种:
- placeholder
- error
- fallback
前两种用的比较多,第三种不被很多人了解.
后备回调符(Fallback)在请求的url/model为 null 时展示。
glide在传入的图片地址为null时,如果不设置fallback 图会显示error的图,如果连error 图都没设置则显示placeholder图.
默认情况下Glide将 null 作为错误处理,所以可以接受 null 的应用应当显式地设置一个 fallback Drawable 。
String url=null;
GlideApp.with(this)
.asDrawable()
.fallback(new ColorDrawable(Color.RED))
.placeholder(new ColorDrawable(Color.BLACK))
.error(new ColorDrawable(Color.BLUE))
.load(url)
.into(imageView);
经个人以上代码验证,只有当url为null才会显示红色,及时传入空字符串都默认为error,然后显示绿色.
![](https://img.haomeiwen.com/i622557/c1ebdb67fa3a1b74.png)
缓存设置
Glide在发起网络请求获取图片前,先检测内存和磁盘中是否已存在,如果存在则直接从本地取.glide的检测位置有:
- 活动资源 (Active Resources) - 现在是否有另一个 View 正在展示这张图片?
- 内存缓存 (Memory cache) - 该图片是否最近被加载过并仍存在于内存中?
- 资源类型(Resource) - 该图片是否之前曾被解码、转换并写入过磁盘缓存?
- 数据来源 (Data) - 构建这个图片的资源是否之前曾被写入过文件缓存?
缓存策略分:磁盘缓存和内存缓存两种策略
磁盘缓存策略
V4和V3的磁盘缓存策略有所不通,使用时需要注意
我们通过DiskCacheStrategy来配置缓存策略
![](https://img.haomeiwen.com/i622557/6d80f3b29ac5786b.png)
看到上表中共有5种:
- NONE
不保存数据到磁盘
- DATA
将未解码数据(即原始数据)直接写入到磁盘
- RESOURCE
将资源解码后再存入磁盘
- ALL
下载远程资源时即保存原始数据也保存解码后的数据到磁盘(DATA+RESOURCE),如果加载的是本地资源则只保存解码后的资源到磁盘(RESOURCE)
- AUTOMIC
glide默认策略(V4之前默认是ALL),它会尝试对本地和远程图片使用最佳的策略。
当你加载远程数据(比如,从URL下载)时,AUTOMATIC 策略仅会存储未被你的加载过程修改过(比如,变换,裁剪)的原始数据,因为下载远程数据相比调整磁盘上已经存在的数据要昂贵得多。对于本地数据,AUTOMATIC 策略则会仅存储变换过的缩略图,因为即使你需要再次生成另一个尺寸或类型的图片,取回原始数据也很容易。
清空磁盘缓存
new AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
// This method must be called on a background thread.
Glide.get(applicationContext).clearDiskCache();
return null;
}
}
内存缓存策略
总共就2中情况:使用内存缓存和不使用内存缓存
注意通过skipMemoryCache来设置是否跳过内存缓存
#使用内存缓存
这个是默认情况可以不用设置
GlideApp.with(this)
.asDrawable()
.load("")
.skipMemoryCache(false)
.into(imageView);
不使用内存缓存:
GlideApp.with(this)
.asDrawable()
.load("")
.skipMemoryCache(true)
.into(imageView);
注意:对于相同的 URL ,如果你的初始请求没调用 .skipMemoryCache(true) 方法,你后来又调用了 .skipMemoryCache(true) 这个方法,这个资源将会在内存中获取缓存。
onlyRetrieveFromCache(仅从缓存加载图片)
某些情形下,你可能希望只要图片不在缓存中则加载直接失败,此时你个就可以使用onlyRetrieveFromCache:
GlideApp.with(this)
.asDrawable()
.load("")
.onlyRetrieveFromCache(true)
.into(imageView);
不缓存图片
GlideApp.with(this)
.asDrawable()
.load("")
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
清空内存缓存
最好异步进行:
Glide.get(context).clearMemory();
参考文档:
Github地址
中文文档
郭霖关于V3的Glide源码解析
Glide与Picasso的对比
Android高效加载大图、多图解决方案,有效避免程序OOM
Android LruCache源码分析
网友评论