基本用法
自定义模块功能可以将更改Glide配置,替换Glide组件等操作独立出来,可以轻松地对Glide的各种配置进行自定义,并且和Glide的图片加载逻辑没有任何交集,实现了低耦合。
自定义很简单,定义一个模块类继承 AppGlideModule,如下所示
1 | @GlideModule |
不过要注意的是,定义的模块类需要添加@GlideModule注解。
其中重写了两个方法,其中applyOptions()
方法用来更改Glide配置,registerComponents()
方法用来替换Glide组件。
Glide自定义模块的功能就是这样,后面只需要在applyOptions()和registerComponents()这两个方法中加入具体的逻辑,就能实现更改Glide配置或者替换Glide组件的功能。
更改Glide配置
想要更改Glide配置,只需要在 applyOptions() 方法中提前将Glide的配置项进行初始化就可以了。常用的Glide配置有
setMemoryCache()
用于配置Glide的内存缓存策略,默认配置是LruResourceCache。
setBitmapPool()
用于配置Glide的Bitmap缓存池,默认配置是LruBitmapPool。
setDiskCache()
用于配置Glide的硬盘缓存策略,默认配置是InternalCacheDiskCacheFactory。
setDecodeFormat()
用于配置Glide加载图片的解码模式,默认配置是RGB_565。
setMemoryCache()
默认情况下,Glide使用 LruResourceCache ,这是 MemoryCache 接口的一个缺省实现,使用固定大小的内存和 LRU 算法。LruResourceCache 的大小由 Glide 的 MemorySizeCalculator 类来决定,这个类主要关注设备的内存类型,设备 RAM 大小,以及屏幕分辨率。
使用如下:
1 | //第1种:通过配置 MemorySizeCalculator |
setBitmapPool()
Glide 使用 LruBitmapPool 作为默认的 BitmapPool 。LruBitmapPool 是一个内存中的固定大小的 BitmapPool,使用 LRU 算法清理。默认大小基于设备的分辨率和密度,同时也考虑内存类和 isLowRamDevice 的返回值。具体的计算通过 Glide 的 MemorySizeCalculator 来完成,与 Glide 的 MemoryCache 的大小检测方法相似。
使用如下:
1 | //第1种:通过配置 MemorySizeCalculator |
setDiskCache()
Glide默认的硬盘缓存策略使用的是InternalCacheDiskCacheFactory,这种缓存会将所有Glide加载的图片都存储到当前应用的私有目录下,默认磁盘大小为 250 MB 。
Glide内置了一个ExternalCacheDiskCacheFactory,可以允许将加载的图片都缓存到SD卡。
使用如下:
1 | int diskCacheSizeBytes = 500 * 1024 * 1024; |
这时候再去加载图片,图片缓存就会保存到磁盘中。
setDecodeFormat()
Glide加载图片的默认格式是RGB_565,如果希望图片展现效果最佳,需要设置为ARGB_8888,则就通过 setDecodeFormat() 方法来设置。
使用如下:
1 | builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888); |
替换Glide组件
详情去官方文档中 配置 学习用法。
Glide官方给我们提供了非常简便的HTTP组件替换方式。并且除了支持OkHttp3之外,还支持OkHttp2和Volley。
目前主流的HTTP框架是okhttp3,引用方式如下:
1 | //HTTP组件替换为okhttp3 |
Generated API
Glide v4 使用注解处理器 (Annotation Processor) 来生成出一个 API,在 Application 模块中可使用该流式 API 一次性调用到 RequestBuilder, RequestOptions 和集成库中所有的选项。
简单来说就是,在Glide v4中,通过自定义一个模块,添加@GlideModule注解,重新编译后,提供了一套和Glide v3一模一样的流式API接口。
用法如下:
1 | GlideApp.with(this) |
如果有用过Glide v3的需要注意下,v3中的Glide关键字要替换成GlideApp关键字。
Generated API所能做到的并不只是这些而已,它还可以对现有的API进行扩展,定制出任何属于你自己的API,需要借助 @GlideExtension 。
@GlideExtension 注解用于标识一个扩展 Glide API 的类,被 @GlideExtention 注解的类有两种扩展方式:
- @GlideOption - 为 RequestOptions 添加一个自定义的选项。
- @GlideType - 添加对新的资源类型的支持(GIF,SVG 等等)。
@GlideOption
用 @GlideOption 注解的静态方法用于扩展 RequestOptions 。GlideOption 可以:
1、定义一个在 Application 模块中频繁使用的选项集合。
2、创建新的选项,通常与 Glide 的 Option 类一起使用。
要定义一个选项集合,可以这么写:
1 | @GlideExtension |
重新编译之后,在build/generated/source/apt/debug 下app对应包名下 GlideOptions 中生成一个方法:
1 | public final class GlideOptions extends RequestOptions { |
之后你就可以使用生成的 GlideApp 类调用自定义方法:
1 | GlideApp.with(fragment) |
使用 @GlideOption 标记的方法应该为静态方法,并且返回值为空,可以为方法任意添加参数,但要保证第一个参数为 RequestOptions。请注意,这些生成的方法在一般的 Glide 和 RequestOptions 类里不可用。
@GlideType
被 @GlideType 注解的静态方法用于扩展 RequestManager。被 @GlideType 注解的方法允许你添加对新的资源类型的支持,包括指定默认选项。
参考官方的例子,简单列举下用法,例如,为添加对 GIF 的支持,你可以添加一个被 @GlideType 注解的方法:
1 | @GlideExtension |
重新编译之后,在build/generated/source/apt/debug 下app对应包名下会生成一个包含对应方法的 RequestManager :
1 | public class GlideRequests extends RequesetManager { |
之后你可以使用生成的 GlideApp 类调用你的自定义类型:
1 | GlideApp.with(fragment) |
被 @GlideType 标记的方法必须使用 RequestBuilder