Glide源码分析(八),Glide的自定义模块扩展与实践

本文介绍了Glide v4如何通过Annotation Processor生成API,以及如何使用@GlideModule替换默认组件。重点讲解了@GlideExtension用于扩展Glide API,包括GlideOption和GlideType的使用。同时,文中提供了网络加载和DiskCache加载时的图片加载监听实现,通过自定义ModelLoader、DataFetcher和ResourceDecoder监听下载进度。
摘要由CSDN通过智能技术生成

Generated API

Glide v4使用注解处理器(Annotation Processor)来生成出一个API,在Application模块中可使用该流式API一次性调用到RequestBuilder,RequestOptions和集成库中所有的选项。

GeneratedAPI模式的设计出于以下两个目的:

  1. 集成库可以为Generated API扩展自定义选项。
  2. 在Application模块中可将常用的选项组打包成一个选项在Generated API中使用。
@GlideModule

AppGlideModule的实现必须使用@GlideModule注解标记。如果注解不存在,该module将不会被Glide发现。在这个注解类中,我们一般是替换Glide初始化的时候添加的默认组件。

@GlideModule
public class MyAppGlideModule extends AppGlideModule {
   

    @Override
    public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {
        super.registerComponents(context, glide, registry);
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.addInterceptor(new LoadingInterceptor());
        OkHttpClient okHttpClient = builder.build();
        registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(okHttpClient));
    }
}

在我们这里,则是调用registry.replace方法,将Glide初始化过程中的

        .append(GlideUrl.class, InputStream.class, new HttpGlideUrlLoader.Factory())

替换成了

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

这个是在GlideModule中常见的实用,替换默认组件,换成自定义的组件,在实际项目中,非常的方便和便于拓展,我这里是替换了一个下载框架,加了一个拦截器,实现下载的进度条监听,后面我会简单的贴相关的代码细节。

@GlideExtension

Glide Generated API 可在Application和Library中被扩展。扩展使用被注解的静态方法来添加新的选项、修改现有选项、甚至添加额外的类型支持。

@GlideExtension 注解用于标识一个扩展Glide API的类。任何扩展Glide API的类都必须使用这个注解来标记,否则其中被注解的方法就会被忽略。

被@GlideExtension注解的类应以工具类的思维编写。这种类应该有一个私有的、空的构造方法,应为final类型,并且仅包含静态方法。被注解的类可以含有静态变量,可以引用其他的类或对象。

在Application模块中可以根据需求实现任意多个被@GlideExtension注解的类,在Library模块中同样如此。当AppGlideModule被发现时,所有有效的Glide扩展类会被合并,所有的选项在API中均可以被调用。合并冲突会导致Glide的Annotation Processor抛出编译错误。

被@GlideExtention注解的类有两种扩展方式:

  1. GlideOption - 为RequestOptions添加一个自定义的选项。
  2. GlideType - 添加对新的资源类型的支持(GIF,SVG 等等)。

注解@GlideOption和@GlideType均是修饰一个方法,前者修饰的会在GlideOptions与GlideRequest中生成方法,后者修饰的会在GlideRequests中生成方法,一个简单的例子如下:

GlideExtension扩展

@GlideExtension
public class MyAppExtension {
   

    private static final int MIN_THUMB_SIZE = 100;

    private static
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值