Glide 是 Android 中有名的图片加载框架了,这篇文章不是列举 Glide 的加载图片函数及入参方式含义,相信这些很多博客都有介绍基本使用,也不是深入底层源码去查看缓存、生命周期、转换等源码实现方式,仅仅为了模板的介绍下 Glide 的全局基础配置。
此篇博客较为简短,意在提供相关的基础配置,如有哪里错误,欢迎及时指出。
贴出一张 Glide 的框架大致图(源码一定要读)
首先,引入 Glide 依赖,这里用到了 Kotlin,大家应该都不陌生了(okhttp3-integration 后续会用到,那里介绍)。这里使用的是 Glide 4.0 以上(4.0 是一个分水岭)
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
//https://github.com/bumptech/glide
api 'com.github.bumptech.glide:glide:4.11.0'
kapt 'com.github.bumptech.glide:compiler:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
api "com.github.bumptech.glide:okhttp3-integration:4.11.0"
AppGlideModule
Glide 为开发者提供的一个可以全局配置 Glide 参数的接口,一个应用程序只能定义一次。
我们可以复写 applyOptions 函数,为自己的应用配置缓存地址、缓存大小、线程池、日志等等。具体参考 GlideBuilder 中的成员及配置方法。下面贴出 源码中的 applyOptions 以及我自己的部分配置
@Override
public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
// Default empty impl.
}
GlideBuilder
用来创建 Glide 实例的类,其中包含了很多个 get/set 方法,例如设置 BitmapPool、MemoryCache、ArrayPool 等等,最终通过这些设置调用 build 方法构建 Glide。
代码中有大致的方法注释,可参考
override fun applyOptions(context: Context, builder: GlideBuilder) { //获取最大可用内存
val maxMemory = Runtime.getRuntime().maxMemory().toInt()
//设置缓存的大小
val cacheSize = maxMemory / 8
// Default empty impl.
//设置Bitmap的缓存池
builder.setBitmapPool(LruBitmapPool(30))
//设置内存缓存
builder.setMemoryCache(LruResourceCache(cacheSize.toLong()))
//设置磁盘缓存
builder.setDiskCache(InternalCacheDiskCacheFactory(context))
//设置读取不在缓存中资源的线程
builder.setSourceExecutor(GlideExecutor.newSourceExecutor())
//设置读取磁盘缓存中资源的线程
builder.setDiskCacheExecutor(GlideExecutor.newDiskCacheExecutor())
//设置日志级别
builder.setLogLevel(Log.VERBOSE)
//设置全局选项
val requestOptions = RequestOptions().format(DecodeFormat.PREFER_RGB_565)
builder.setDefaultRequestOptions(requestOptions)
}
AppGlideModule 只能书写一次,那么如果你在第三方库中使用了 Glide ,也想做相关配置,该怎么办? Glide 提供了 LibraryGlideModule ,可配置多个,用于库中使用。配置与 AppGlideModule 略有不同,没有全局的 applyOptions 函数,只提供 registerComponents 函数,此函数在后续的 OkHttp 配置中讲到。
@Override
public void registerComponents(
@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {
// Default empty impl.
}
build 一下 会在 generated.source.kapt.debug 下生成 GeneratedAppGlideModuleImpl 等相关文件,此时就可以使用 GlideApp 了。
OkHttp设置
主 Module 与 库 Module 的全局配置完成后,有些了解深的同学知道 Glide 默认的请求网络框架是 HttpURLConnection ,我们想改成 OkHttp 就需要用到 registerComponents 函数了。开篇说到了 okhttp3-integration 就是为此而来的。
override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
super.registerComponents(context, glide, registry)
registry.replace(GlideUrl::class.java, InputStream::class.java, OkHttpUrlLoader.Factory(OkHttpClient))
}
OkHttpClient 即自己定义的 OkHttpClient ,这涉及到 OkHttp 的知识了,此方面就不多说了。
我们可以查看 OkHttpUrlLoader 的源码,它继承 ModelLoader
public class OkHttpUrlLoader implements ModelLoader {
//...
}
public class HttpGlideUrlLoader implements ModelLoader {
//...
}
相信阅读过此源码的话,自己也可以实现更多类型的 ModelLoder 了。
Glide 就是单例类,因此我们使用时可以自己定义相关便捷的操作方法,这里把相关的操作方法统一贴出来以供参考。
GlideEngine,代码比较长,其中包含了 第三方库 PictureSelector 的配置,还有缓存的大小获取及清理相关的方法。
对于像 Glide 这种优秀的源码看一遍能学到很多东西,受益匪浅,而且源码是越看越熟,看得多了,再去看别的框架就很简单。