Glide笔记(一)AppGlideModule
·
配置:
1)添加依赖
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
2)自定义类继承AppGlideModule,添加类注解@GlideModule,实现方法isManifestParsingEnabled(),并返回false如:
@GlideModule
public class CustomGlideModule extends AppGlideModule {
@Override
public boolean isManifestParsingEnabled() {
return false;
}
`
3)之后可以通过重写其中的方法applyOptions(…)以及registerComponents(…)实现自己需要的配置,如:
```java
@Override
public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
File externalFilesDir = context.getExternalFilesDir(null);
if (externalFilesDir != null) {
String diskCacheFolder = externalFilesDir.getAbsolutePath();
Log.e("TAG", "diskCacheFolder->" + diskCacheFolder);
builder.setDiskCache(new DiskLruCacheFactory(diskCacheFolder, "imageCache", (1024 * 1024 * 50)));
} else {
Log.e("TAG", "null->");
}
}
4)在AndroidManifest.xml中<application>中添加<meta-data>项,如:
```java
<meta-data
android:name="com.zjb.glide.CustomGlideModule"
android:value="AppGlideModule"/>
5)混淆配置
-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 *;
}
-keep class com.bumptech.glide.GeneratedAppGlideModuleImpl {*;}
至此配置完成,初始化Glide时,会引用自定义的CustomGlideModule.
简单记下通过注解和实现自动引用CustomGlideModule的流程:
1)Glide初始化时首先调用Glide中的
@VisibleForTesting
public static void init(@NonNull Context context, @NonNull GlideBuilder builder) {
GeneratedAppGlideModule annotationGeneratedModule = getAnnotationGeneratedGlideModules(context);
synchronized (Glide.class) {
if (Glide.glide != null) {
tearDown();
}
initializeGlide(context, builder, annotationGeneratedModule);
}
}
2)其中代码:
GeneratedAppGlideModule annotationGeneratedModule = getAnnotationGeneratedGlideModules(context);
生成的GeneratedAppGlideModule对象为其实现类GeneratedAppGlideModuleImpl,这个类为编译后自动生成的(注意,如果配置混淆,此类也不应该被混淆),可以看看这个类的内容:
final class GeneratedAppGlideModuleImpl extends GeneratedAppGlideModule {
private final CustomGlideModule appGlideModule;
public GeneratedAppGlideModuleImpl(Context context) {
appGlideModule = new CustomGlideModule();
if (Log.isLoggable("Glide", Log.DEBUG)) {
Log.d("Glide", "Discovered AppGlideModule from annotation: com.zjb.CustomGlideModule");
}
}
@Override
public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
appGlideModule.applyOptions(context, builder);
}
@Override
public void registerComponents(@NonNull Context context, @NonNull Glide glide,
@NonNull Registry registry) {
appGlideModule.registerComponents(context, glide, registry);
}
@Override
public boolean isManifestParsingEnabled() {
return appGlideModule.isManifestParsingEnabled();
}
@Override
@NonNull
public Set<Class<?>> getExcludedModuleClasses() {
return Collections.emptySet();
}
@Override
@NonNull
GeneratedRequestManagerFactory getRequestManagerFactory() {
return new GeneratedRequestManagerFactory();
}
}
可以看到它持有一个我们定义的CustomAppModule对象,实现的接口方法也是通过调用CustomAppModule对象的方法实现。
3)之后我们继续看Glide的初始化过程会调用方法initializeGlide(…),其代码如下:
.......................
if (annotationGeneratedModule != null) {
annotationGeneratedModule.applyOptions(applicationContext, builder);
}
.........................
if (annotationGeneratedModule != null) {
annotationGeneratedModule.registerComponents(applicationContext, glide, glide.registry);
}
也就是上面提到的实现类GeneratedAppGlideModuleImpl中方法的调用,GeneratedAppGlideModuleImpl中的方法是调用他持有的CustomAppGlideModule对象的方法。
更多推荐
已为社区贡献1条内容
所有评论(0)