结合实例讲解自定义 GlideModule的常见场景应用

2025-03-06 17:14 结合实例讲解自定义 GlideModule的常见场景应用已关闭评论

以下是通过实例讲解 自定义 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
}

最佳实践与注意事项

  1. 组件注册顺序

    • 使用 append() 添加新组件(保留默认组件)。
    • 使用 prepend() 优先使用自定义组件。
    • 使用 replace() 完全替换默认组件。
  2. 版本兼容性

    • Glide 4.x 必须使用 @GlideModule 注解。
    • 旧版 Glide 3.x 需在 AndroidManifest.xml 中声明:
      <meta-data
          android:name="com.your.package.CustomGlideModule"
          android:value="GlideModule" />
      
  3. 调试验证

    • 生成的 GlideApp 类应出现在 build/generated 目录。
    • 通过 GlideApp.with() 调用验证配置是否生效。

总结:常见场景与对应配置

场景 关键技术点
替换网络层 Registry.replace() + OkHttp
调整缓存策略 GlideBuilder.setDiskCache()
全局默认变换 setDefaultRequestOptions()
扩展数据源支持 自定义 ModelLoader + Registry.append()
请求监控与日志 addRequestInterceptor
优化内存分配 自定义 BitmapPool

通过合理使用 GlideModule,可以实现 Glide 的深度定制,满足企业级应用对性能、监控和扩展性的高阶需求。建议结合 ResourceDecoderTranscoder 等接口实现更多定制化功能。

当前文章价值4.26元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

你可能感兴趣的文章

来源:每日教程每日一例,深入学习实用技术教程,关注公众号TeachCourse
转载请注明出处: https://teachcourse.cn/3784.html ,谢谢支持!

资源分享

分类:glide 标签:,
Python高阶函数(map, filter, reduce)示例 Python高阶函数(map, filter,
Rethinkdb详细介绍和示例说明 Rethinkdb详细介绍和示例说明
避孕常见的误区 避孕常见的误区
Android开发之数据存储的四种方式之一:Network存储 Android开发之数据存储的四种方

评论已关闭!