Glide 全局配置(缓存、线程、OkHttp)

Glide 是 Android 中有名的图片加载框架了,这篇文章不是列举 Glide 的加载图片函数及入参方式含义,相信这些很多博客都有介绍基本使用,也不是深入底层源码去查看缓存、生命周期、转换等源码实现方式,仅仅为了模板的介绍下 Glide 的全局基础配置。

此篇博客较为简短,意在提供相关的基础配置,如有哪里错误,欢迎及时指出。

 

贴出一张 Glide 的框架大致图(源码一定要读)

Glide 全局配置(缓存、线程、OkHttp)_第1张图片

 

 

首先,引入 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 接口,此接口为工厂模式,将 Model 转化为 Data 类型,OkHttpUrlLoader 与 HttpGlideUrlLoader 类似,将 GlideUrl 转化为 InputStream。这样就可以实现更换网络请求框架了。

public class OkHttpUrlLoader implements ModelLoader {
//...
}

public class HttpGlideUrlLoader implements ModelLoader {
//...
}

相信阅读过此源码的话,自己也可以实现更多类型的 ModelLoder 了。

 

Glide 就是单例类,因此我们使用时可以自己定义相关便捷的操作方法,这里把相关的操作方法统一贴出来以供参考。

GlideEngine,代码比较长,其中包含了 第三方库 PictureSelector 的配置,还有缓存的大小获取及清理相关的方法。

 

对于像 Glide 这种优秀的源码看一遍能学到很多东西,受益匪浅,而且源码是越看越熟,看得多了,再去看别的框架就很简单。

 

你可能感兴趣的:(Android基础整理)