以下是通过实例讲解 自定义 GlideModule 的常见应用场景,涵盖基础配置到高级扩展,帮助开发者灵活定制 Glide 的全局行为。
GlideModule 核心作用
通过 @GlideModule 注解的类,可以:
1. 替换默认组件(如网络层、解码器)
2. 调整缓存策略
3. 注册全局 Transformation
4. 添加全局请求拦截器
5. 扩展数据源支持
场景 1:替换网络层为 OkHttp
需求:使用 OkHttp 替代默认的 HttpURLConnection,实现更高效的网络请求。
实现:在 GlideModule 中替换 Registry 的网络组件。
@GlideModule
class CustomGlideModule : AppGlideModule() {
override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
// 创建 OkHttpClient(可添加统一请求头、拦截器等)
val okHttpClient = OkHttpClient.Builder()
.addInterceptor { chain ->
val request = chain.request().newBuilder()
.header("Authorization", "Bearer token123")
.build()
chain.proceed(request)
}
.build()
// 替换网络组件
registry.replace(
GlideUrl::class.java,
InputStream::class.java,
OkHttpUrlLoader.Factory(okHttpClient)
)
}
}
场景 2:调整全局缓存策略
需求:扩大磁盘缓存空间至 200MB,禁用内存缓存。
实现:在 applyOptions 方法中配置缓存参数。
@GlideModule
class CustomGlideModule : AppGlideModule() {
override fun applyOptions(context: Context, builder: GlideBuilder) {
// 配置磁盘缓存
builder.setDiskCache(
InternalCacheDiskCacheFactory(context, "glide_cache", 200 * 1024 * 1024)
)
// 禁用内存缓存(或调整大小)
builder.setMemoryCache(MemoryCache.NONE)
}
}
场景 3:全局默认图片变换
需求:所有图片默认添加圆角效果,避免重复配置。
实现:通过 applyOptions 设置默认 RequestOptions。
@GlideModule
class CustomGlideModule : AppGlideModule() {
override fun applyOptions(context: Context, builder: GlideBuilder) {
val options = RequestOptions()
.transform(RoundedCorners(16))
.placeholder(R.drawable.global_placeholder)
.error(R.drawable.global_error)
builder.setDefaultRequestOptions(options)
}
}
场景 4:支持新数据源(如 Base64 图片)
需求:支持直接加载 Base64 编码的图片字符串。
实现:自定义 ModelLoader 并注册到 Registry。
// 步骤1:定义 Base64 模型加载器
class Base64ModelLoader : ModelLoader<String, InputStream> {
override fun buildLoadData(
model: String,
width: Int,
height: Int,
options: Options
): ModelLoader.LoadData<InputStream>? {
return if (model.startsWith("data:image")) {
ModelLoader.LoadData(
ObjectKey(model),
Base64DataFetcher(model)
)
} else {
null
}
}
override fun handles(model: String): Boolean {
return model.startsWith("data:image")
}
}
// 步骤2:注册到 GlideModule
@GlideModule
class CustomGlideModule : AppGlideModule() {
override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
registry.append(
String::class.java,
InputStream::class.java,
Base64ModelLoader.Factory()
)
}
}
// 使用:直接加载 Base64 字符串
GlideApp.with(context)
.load("data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...")
.into(imageView)
场景 5:添加全局日志拦截器
需求:监控所有 Glide 请求的详细日志,用于调试。
实现:自定义 RequestInterceptor 并添加到全局配置。
@GlideModule
class CustomGlideModule : AppGlideModule() {
override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
glide.addRequestInterceptor { request ->
Log.d("GlideRequest", "开始加载: ${request.model}")
request.addListener(object : RequestListener<Any> {
override fun onResourceReady(...): Boolean {
Log.d("GlideRequest", "加载成功: ${request.model}")
return false
}
override fun onLoadFailed(...): Boolean {
Log.e("GlideRequest", "加载失败: ${request.model}", e)
return false
}
})
request
}
}
}
场景 6:自定义 Bitmap 解码池
需求:优化大图处理时的内存分配效率。
实现:替换默认的 BitmapPool 实现。
@GlideModule
class CustomGlideModule : AppGlideModule() {
override fun applyOptions(context: Context, builder: GlideBuilder) {
// 创建支持大图的 BitmapPool
val bitmapPool = LruBitmapPool(
(Runtime.getRuntime().maxMemory() / 8).toInt(),
arrayListOf(Bitmap.Config.RGB_565, Bitmap.Config.ARGB_8888),
true
)
builder.setBitmapPool(bitmapPool)
}
}
场景 7:禁用 Manifest 解析
需求:提升初始化速度(当无需兼容旧版 GlideModule 时)。
实现:重写 isManifestParsingEnabled 方法。
@GlideModule
class CustomGlideModule : AppGlideModule() {
// 禁用 Manifest 中查找旧版 GlideModule
override fun isManifestParsingEnabled(): Boolean = false
}
最佳实践与注意事项
-
组件注册顺序:
- 使用
append()添加新组件(保留默认组件)。 - 使用
prepend()优先使用自定义组件。 - 使用
replace()完全替换默认组件。
- 使用
-
版本兼容性:
- Glide 4.x 必须使用
@GlideModule注解。 - 旧版 Glide 3.x 需在
AndroidManifest.xml中声明:<meta-data android:name="com.your.package.CustomGlideModule" android:value="GlideModule" />
- Glide 4.x 必须使用
-
调试验证:
- 生成的 GlideApp 类应出现在
build/generated目录。 - 通过
GlideApp.with()调用验证配置是否生效。
- 生成的 GlideApp 类应出现在
总结:常见场景与对应配置
| 场景 | 关键技术点 |
|---|---|
| 替换网络层 | Registry.replace() + OkHttp |
| 调整缓存策略 | GlideBuilder.setDiskCache() |
| 全局默认变换 | setDefaultRequestOptions() |
| 扩展数据源支持 | 自定义 ModelLoader + Registry.append() |
| 请求监控与日志 | addRequestInterceptor |
| 优化内存分配 | 自定义 BitmapPool |
通过合理使用 GlideModule,可以实现 Glide 的深度定制,满足企业级应用对性能、监控和扩展性的高阶需求。建议结合 ResourceDecoder、Transcoder 等接口实现更多定制化功能。
当前文章价值4.26元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

评论已关闭!