Glide自定义组件注册
转载请标明出处:http://77blogs.com/?p=272
本文基于Glide 4.11
Glide支持自定义组件注册,Glide V4可以使用apt来生成一个api。
一、步骤:
1、新建一个GifGlideModule类,使用@GlideModule注解,然后继承AppGlideModule,rebuild后会自动帮我们生成一些类了。
@GlideModule public class GifGlideModule extends AppGlideModule { @Override public void registerComponents(@NonNull Context context , @NonNull Glide glide, @NonNull Registry registry) { super.registerComponents(context, glide, registry); registry.append( Registry.BUCKET\_GIF, InputStream.class, FrameSequenceDrawable.class, new GifDecoder(glide.getBitmapPool())); } }
以上的代码就是注册自定义的组件:
对于Gif类型的数据,将InputStream解码为FrameSequenceDrawable类型,解码器为GifDecoder
2、rebuild后我们可以在工程目录下看到生成的文件:

3、调用
之后我们就可以运用这种方式来调用加载了:
GlideApp.with(context).as(FrameSequenceDrawable.class).load(path).into(view);
二、原理
我们在Glide的初始化方法initializeGlide里面可以看到:
GeneratedAppGlideModule annotationGeneratedModule = getAnnotationGeneratedGlideModules(context.getApplicationContext());
点进去可以看到关键部分的代码为

Glide提供给我们自定义加载组件的方式,在Glide 3x中,我们首先会定义一个继承于GlideModule的类,然后在项目的AndroidMenifest.xml中进行指定:
<meta-data android:name="com.test.GlideConfiguration" android:value="GlideModule"/>
而在Glide4中,提供另外一个配置的模式,那就是注解,并且不再继承GlideModule,而是继承AppGlideModule和LibraryGlideModule,分别对应Application和Library,使用@GlideModule注解进行标记。而Glide3.x中的配置方式已经建议放弃使用。
getAnnotationGeneratedGlideModules(context.getApplicationContext());便是获取Glide注解自动生产的一个Glide的Module配置器,叫做:
GeneratedAppGlideModuleImpl
然后将其作为参数最终传递到initializeGlide方法。
initializeGlide方法:

上面这一段的意思就是:从manifest中解析到我们自定义的GlideModule类,如果判断与注解生成的类重复,那么就可以去掉。
annotationGeneratedModule.isManifestParsingEnabled()
判断是否还支持Glide 3x的在AndroidMenifest.xml中进行指定的方式,默认是返回true,说明现在还是支持的。
接着以上代码,Glide将逐个调用剩下的GlideModule,并回调applyOptions和registerComponents接口,这时,用户配置的GlideModule就会被调用,同时用户设置的参数也就被配置到Glide中。

源码中获取的通过注解生成的GlideModule只有一个,这也说明了我们只能通过注解配置一次。