AppGlideModule 是什么?
AppGlideModule就是Glide的全局配置文件,4.0以上添加的,之前是 GlideModule
配置 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