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只有一个,这也说明了我们只能通过注解配置一次。

类似文章

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注