每天记录学习的新知识 : AppGlideModule

本文详细介绍了Glide的全局配置AppGlideModule的使用方法,包括如何配置图片缓存路径和大小,设置内存缓存和Bitmap池大小,以及如何替换网络请求组件。同时,文章还提供了如何使用AppGlideModule来提高Glide的性能和自定义图片加载策略的实例。

AppGlideModule 是什么?

AppGlideModule就是Glide的全局配置文件,4.0以上添加的,之前是 GlideModule

https://muyangmin.github.io/glide-docs-cn/javadocs/400/com/bumptech/glide/module/AppGlideModule.html

配置 AppGlideModule

Glide 4.10 以上的版本必须配置

@GlideModule
public class GlideConfigModule extends AppGlideModule {

    private static final String TAG = "GlideConfigModule";

    /**
     * 配置图片缓存的路径和缓存空间的大小
     */
    @Override
    public void applyOptions(@NonNull final Context context, GlideBuilder builder) {

    }

    @Override
    public boolean isManifestParsingEnabled() {
        return false;
    }

    /**
     * 注册指定类型的源数据,并指定它的图片加载所使用的 ModelLoader
     */
    @Override
    public void registerComponents(@NonNull Context context, @NonNull Glide glide, Registry registry) {
        AppLogUtils.i(TAG, "registerComponents");
    }

}
        <meta-data
            android:name=".datamodle.glide.GlideConfigModule"
            android:value="AppGlideModule" />

混淆:

################glide 4.10 之前的混淆###############
#-keep public class * implements com.bumptech.glide.module.AppGlideModule
#-keep public class * implements com.bumptech.glide.module.LibraryGlideModule
#-keep class com.bumptech.glide.** { *; }
#-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
#    **[] $VALUES;
#    public *;
#}

# Glide 4.10 及以后
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}

接口功能描述

void applyOptions(@NonNull final Context context, GlideBuilder builder)

    @Override
    public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
        super.applyOptions(context, builder);
    }

覆写 applyOptions 可以配置 Glide , GlideBuilder 是我们的核心参数

GlideBuilder

GlideBuilder 的 方法

在这里插入图片描述

磁盘缓存设置
  public GlideBuilder setDiskCache(@Nullable DiskCache.Factory diskCacheFactory) {
    this.diskCacheFactory = diskCacheFactory;
    return this;
  }

磁盘缓存配置(默认缓存大小250M,默认保存在内部存储中)

设置磁盘缓存保存在外部存储,且指定缓存大小:

builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, diskCacheSize);

设置磁盘缓存保存在自己指定的目录下,且指定缓存大小

builder.setDiskCache(new DiskLruCacheFactory(new DiskLruCacheFactory.CacheDirectoryGetter() {
            @Override
            public File getCacheDirectory() {
                return diskCacheFolder;
            }
        }, diskCacheSize);

例:


	int IMAGE_CACHE_COUNT = 100 * 1024 * 1024;

    /**
     * 配置图片缓存的路径和缓存空间的大小
     */
    @Override
    public void applyOptions(@NonNull final Context context, GlideBuilder builder) {
        builder.setDiskCache(() -> {
            File cacheLocation = new File(context.getExternalCacheDir(), "GlideCache");
            if (!cacheLocation.exists()) {
                boolean result = cacheLocation.mkdirs();
                AppLogUtils.i(TAG, "create glide image cache dir result == " + result);
            } else {
                AppLogUtils.i(TAG, "glide image cache dir is already exists");
            }
            return DiskLruCacheWrapper.create(cacheLocation, Constant.IMAGE_CACHE_COUNT);
        });
    }
内存缓存配置(不建议配置,Glide会自动根据手机配置进行分配)

设置内存缓存大小

builder.setMemoryCache(new LruResourceCache(memoryCacheSize));
设置Bitmap池大小
builder.setBitmapPool(new LruBitmapPool(bitmapPoolSize));
图片质量

Glide默认使用低质量的RGB565,如果想使用高质量

builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888)

void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry)

替换网络请求组件

    @Override
    public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {
        super.registerComponents(context, glide, registry);
    }

Glide 默认使用 HttpURLConnection 做网络请求,在这切换成 Okhttp 请求

registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(okHttpClient));

如果要加载HTTPS的图片:

    implementation('com.github.bumptech.glide:glide:4.11.0') {
    }
    annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
    implementation 'com.github.bumptech.glide:okhttp3-integration:4.11.0'

    /**
     * 注册指定类型的源数据,并指定它的图片加载所使用的 ModelLoader
     */
    @Override
    public void registerComponents(@NonNull Context context, @NonNull Glide glide, Registry registry) {
        AppLogUtils.i(TAG, "registerComponents");
        registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(UnsafeOkHttpClient.getUnsafeOkHttpClient()));
    }
public class UnsafeOkHttpClient {

    public static OkHttpClient getUnsafeOkHttpClient() {
        try {
            // Create a trust manager that does not validate certificate chains
            final TrustManager[] trustAllCerts = new TrustManager[]{
                    new X509TrustManager() {
                        @Override
                        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                        }

                        @Override
                        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                        }

                        @Override
                        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                            return new java.security.cert.X509Certificate[]{};
                        }
                    }
            };

            // Install the all-trusting trust manager
            final SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

            // Create an ssl socket factory with our all-trusting manager
            final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
            builder.hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });

            builder.connectTimeout(20, TimeUnit.SECONDS);
            builder.readTimeout(20,TimeUnit.SECONDS);

            OkHttpClient okHttpClient = builder.build();
            return okHttpClient;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

}

boolean isManifestParsingEnabled()

用于控制是否需要从 Manifest 文件中解析配置文件

注解方式自定义GlideModule为空;或者不为空时,其函数isManifestParsingEnabled()返回true
(一般情况注解方式自定义GlideModule时,isManifestParsingEnabled方法应返回false,防止去继续加载AndroidManifest.xml中的声明,提高性能)

作者:若丶相见
链接:https://juejin.cn/post/6844903938810970120

例:配置AppGlideModule ,来源项目Arms

@GlideModule(glideName = "GlideArms")
public class GlideConfiguration extends AppGlideModule {
    public static final int IMAGE_DISK_CACHE_MAX_SIZE = 100 * 1024 * 1024;//图片缓存文件最大值为100Mb

    @Override
    public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {

        LogUtils.debugInfo("GlideConfiguration applyOptions");
        final AppComponent appComponent = ArmsUtils.obtainAppComponentFromContext(context);
        builder.setDiskCache(() -> {
            // Careful: the external cache directory doesn't enforce permissions
            return DiskLruCacheWrapper.create(DataHelper.makeDirs(new File(appComponent.cacheFile(), "Glide")), IMAGE_DISK_CACHE_MAX_SIZE);
        });

        MemorySizeCalculator calculator = new MemorySizeCalculator.Builder(context).build();
        int defaultMemoryCacheSize = calculator.getMemoryCacheSize();
        int defaultBitmapPoolSize = calculator.getBitmapPoolSize();

        int customMemoryCacheSize = (int) (1.2 * defaultMemoryCacheSize);
        int customBitmapPoolSize = (int) (1.2 * defaultBitmapPoolSize);

        builder.setMemoryCache(new LruResourceCache(customMemoryCacheSize));
        builder.setBitmapPool(new LruBitmapPool(customBitmapPoolSize));

        //将配置 Glide 的机会转交给 GlideImageLoaderStrategy,如你觉得框架提供的 GlideImageLoaderStrategy
        //并不能满足自己的需求,想自定义 BaseImageLoaderStrategy,那请你最好实现 GlideAppliesOptions
        //因为只有成为 GlideAppliesOptions 的实现类,这里才能调用 applyGlideOptions(),让你具有配置 Glide 的权利
        BaseImageLoaderStrategy loadImgStrategy = appComponent.imageLoader().getLoadImgStrategy();
        if (loadImgStrategy instanceof GlideAppliesOptions) {
            ((GlideAppliesOptions) loadImgStrategy).applyGlideOptions(context, builder);
        }
        //回调到 GlideImageLoaderStrategy
    }

    @Override
    public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {
        //Glide 默认使用 HttpURLConnection 做网络请求,在这切换成 Okhttp 请求
        LogUtils.debugInfo("GlideConfiguration registerComponents");
        AppComponent appComponent = ArmsUtils.obtainAppComponentFromContext(context);
        registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(appComponent.okHttpClient()));

        BaseImageLoaderStrategy loadImgStrategy = appComponent.imageLoader().getLoadImgStrategy();
        if (loadImgStrategy instanceof GlideAppliesOptions) {
            ((GlideAppliesOptions) loadImgStrategy).registerComponents(context, glide, registry);
        }
    }

    @Override
    public boolean isManifestParsingEnabled() {
        return false;
    }
}

使用 AppGlideModule (Generated API)

            GlideApp.with(this)
                    .load(imagePath)
                    .apply(new RequestOptions()
                            .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC))
                    .into(binding.imageView);

参考地址

Glide Github 地址:https://github.com/bumptech/glide
参考地址:Android 图片加载(四)Glide自定义模块
参考:https://github.com/JessYanCoding/MVPArms

GlideModule AppGlideModule和Generated API详解:https://www.pudn.com/news/62d3e72c864d5c73acbeafb8.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周周都刷火焰猫头鹰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值