GlideModule AppGlideModule和Generated API详解-程序员宅基地

技术标签: java  android  开发语言  

GlideModule是3.x就有的,而AppGlideModule和Generated API是4.x才有的功能。
GlideModule已经废弃,替代的是AppGlideModule这个类。并且有了新功能Generated API。Generated API功能非常的好用,下面会给出例子,主要作用就是用来替换原来的RequestOption的写法,Glide觉得这种写法还可以再改进,于是就有了Generated API。

AppGlideModule

因为GlideModule已经废弃,而且因为性能的原因不推荐使用,可以用AppGlideModule替代,GlideModule会在最后做简单介绍。
什么是AppGlideModule?简单来说,AppGlideModule就是Glide的全局配置文件。或者说,本来这些配置我们可能需要写到Application类里面的,单独写一个肯定是更方便维护的。
使用AppGlideModule需要4.x

implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'

继承AppGlideModule并且添加一个@GlideModule注解就可以的,可以不写任何内容,因为有默认实现。

@GlideModule
public class GlideConfig extends AppGlideModule {
    
}

添加完注解后,会在build里面多出几个文件。我们需要用到的就是这个GlideApp类。后面再说。
在这里插入图片描述

通过AppGlideModule,我们可以配置Glide,比如下面的代码可以配置缓存策略和缓存大小。只需要复写applyOptions方法。MemorySizeCalculator类可以根据屏幕大小自动获取合适的缓存大小,非常好用。这是官方给的一个例子。

@GlideModule
public class GlideConfig extends AppGlideModule {
    
    @Override
    public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
    
        //这个类可以根据屏幕大小自动获取合适的缓存大小
        MemorySizeCalculator calculator=new MemorySizeCalculator.Builder(context)
                //不知道屏幕数是什么意思,有两个屏幕(先用着吧)?默认值是2
                .setMemoryCacheScreens(2)
                .build();
        //使用Lru缓存策略
        builder.setMemoryCache(new LruResourceCache(calculator.getMemoryCacheSize()));
    }
}

集成Okhttp

Glide是可以集成第三方网络请求库的,最强大的无疑是OkHttp,可以使用拦截器做很多事情。第三方模块需要继承LibraryGlideModule,实现registerComponents,下面的写法是官方给的例子。这样就已经成功集成OkHttp了。需要引入下面的包。如果已经有OkHttp了需要刨除,避免重复。

 implementation "com.github.bumptech.glide:okhttp3-integration:4.11.0"
@GlideModule
public class OkHttpGlideModule extends LibraryGlideModule {
    
    @Override
    public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {
    
        glide.getRegistry().replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory());
    }
}

Generated API

接下来就要介绍一个最主要的功能Generated API。里面的代码是我们非常的常见的Glide的通常写法,但Glide觉得RequestOptions的这种写法不是特别的优雅。于是为我们改进了写法。这种新写法就是通过Generated API实现的。

		ImageView imageView = findViewById(R.id.iv);
        RequestOptions options=new RequestOptions().centerCrop();
        Glide.with(this)
                .load("")
                .apply(options)
                .into(iv);

例如下面的代码,我们写一个类,并用@GlideExtension注解标记。我们将设置头像的配置写到这个类里面。自定义的这个方法需要用@GlideOption注解,并且第一个参数必须是BaseRequestOptions,后面的参数可以自己定义。

@GlideExtension
final class GlideExtensions {
    
    private GlideExtensions() {
    

    }

    /**
     * 头像配置
     * @param options
     * @param size 图片内存大小
     * @return
     */
    @GlideOption
    public static BaseRequestOptions<?> applyAvatar(BaseRequestOptions<?> options, int size) {
    
        return options.placeholder(R.drawable.ic_launcher_background)
                .error(R.drawable.ic_launcher_background)
                .override(144);
    }
}

接下来可以在代码中直接链式使用刚刚定义的方法,只是要把Glide换成GlideApp,可以看到,我们自己定义的applyAvatar居然可以直接调用,是不是非常的神奇?
GlideApp这种方式是Glide4.x推荐使用的。我觉得非常的优雅,设计非常的巧妙,非常的值得学习。设计的非常艺术。

     GlideApp.with(this)
                .load("")
                .applyAvatar(144)
                .into(imageView);

差不多就是这些内容。通过Generated API就可以做一些奇奇怪怪的事情了。

GlideModule介绍(不推荐使用)

GlideModule是3.x下的,已经废弃,这里还是有必要简单介绍下。
首先下定义,GlideModule是干什么的,源码文档的第一句话就告诉我们使用来做“懒配置”的。但我没发现到底懒在哪里了?官方文档也没说,想了半天,发现可能是我理解错了,这里的“懒”根本就不是“延迟”的意思,而是“懒惰”的意思。说白了就是统一配置,这样在使用的时候就不用每个都配置了。这样我们就可以“偷懒”了。与其说是“懒配置”,我觉得用“预配置“可能更好点。

紧接着官方给了一个例子。Flickr的意思是相册分享的意思,也就是说这里例子是配置照片。不知道为什么这些大公司写的文档例子都不写全,下面的代码是不能运行的,因为里面的几个类没有给,他已经假设你自己能实现这些类(我都知道了还看文档干什么?),而且 glide.register方法只有3.x的版本有,4.x是没有的,实际上这个类已经废弃,如果非要用,就必须用3.x版本的。可能是早期设计出现了什么问题,这种高版本直接删低版本方法的行为不太应该的。

下面的代码其实是来自glide官方提供的一个叫Flickr的sample,但是这个例子我跑不起来,编译已经通过了,大公司的demo都是这样,异常的庞大。不过可以看到MyModelLoader的实现。不过代码太多。

public class FlickrGlideModule implements GlideModule {
    
    
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
    
        builder.setDecodeFormat(DecodeFormat.ALWAYS_ARGB_8888);
    }

    @Override
    public void registerComponents(Context context, Glide glide) {
    
        glide.register(Model.class, Data.class, new MyModelLoader());
    }
}

GlideModule本身就是给接口,代码也非常的少,GlideModule在Glide4.0之后已经废弃,AppGlideModule替代。之所以废弃估计是因为3.x的GlideModule底层是提供反射实现的,而AppGlideModule是提供apt实现的。性能更好。

Glide通过清单文件加载GlideModule的原理

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ScottePerk/article/details/125802766

智能推荐

详细解说LDA线性判别分析方法_lda如何查看判断规则-程序员宅基地

文章浏览阅读6.5k次,点赞7次,收藏21次。转载原文网址:LDA 线性判别分析LDA, Linear Discriminant Analysis,线性判别分析。注意与LDA(Latent Dirichlet Allocation,主题生成模型)的区别。1、引入  上文介绍的PCA方法对提取样本数据的主要变化信息非常有效,而忽略了次要变化的信息。在有些情况下,次要信息可能正是把不同类别区分开来的分布方向。简单来说,PCA方法寻找的是数据变化的..._lda如何查看判断规则

【NanoPi NEO试用体验】开发板启动和开发环境配置_nanopi neo 更换启动界面-程序员宅基地

文章浏览阅读2.5k次,点赞3次,收藏12次。一、烧写系统镜像1.格式化SD卡对sd卡的要求,官方建议Class10或以上的 8GB SDHC卡,容量小或者卡通信速度太慢,都很有隐患。烧写系统映像前,如果之前sd卡写了其他映像文件,或者原本格式不匹配,需格式一下SD卡,保险起见,最好格式一下。这里使用的软件:SDFormatter , 选择要格式的sd卡盘符后,点击格式化:格式成功后,跳出成功提示和相应参数:2. 下载Ubunt..._nanopi neo 更换启动界面

[pgf and tikz]foreach的高级用法:同时循环两个变量_tikz foreach clock-程序员宅基地

文章浏览阅读4.8k次。[pgf and tikz]foreach的高级用法:同时循环两个变量\from 和 \to:\documentclass{beamer}\input{tikzall.tex} %包含所有的tikz包\begin{document}%\begin{frame}\begin{tikzpicture}[scale=1,auto=left,every node/.style={circ_tikz foreach clock

英飞凌 AURIX-TC3XX:QSPI通信实验_tc3x spi 发送完标志-程序员宅基地

文章浏览阅读2.5k次,点赞3次,收藏24次。英飞凌 AURIX-TC3XX:QSPI通信实验_tc3x spi 发送完标志

insmod: cannot insert 'xxxx.ko': Unknown symbol in module (-1): No such file or directory 问题解决的一种情况_insmod: failed to load /data/hack.ko: no such file-程序员宅基地

文章浏览阅读3.2k次。在驱动模块代码中增加如下语句:MODULE_LICENSE("GPL");_insmod: failed to load /data/hack.ko: no such file or directory

C++ 在程序中设置环境变量_c++ 设置环境变量-程序员宅基地

文章浏览阅读1.1w次。环境变量:顾名思义就是程序运行所需要的环境,需要哪些DLL等,每个电脑中本身就会配置一下环境变量,可以通查看电脑属性查看有哪些环境变量:但是如何在程序中查看和修改环境变量呢?C++提供了相应的函数来实现:getenv:查看环境变量putenv:设置环境变量 std::string env = getenv("PATH"); env += ";../../runtime/3rdPart..._c++ 设置环境变量

随便推点

大数据的由来-程序员宅基地

文章浏览阅读3.4k次。大数据概念的的兴起也就是最近不到10年的时间,我们在了解了数据的几个基本概念之后,我们再来看一下大数据出现的背景。数据量大。什么是数据?狭义上讲数据就是数值,也就是我们通过观察、实验或计算得出的结果;从广义上讲,数据的含义更加广阔,也可以是文字、图像、声音等。当前我们所说的数据一般是指广义上的数据。初识大数据什么是大数据?大数据的特点是什么?大数据与传统数据之间有什么关系?大数据与我们有什么关系?尽管许多书籍直接解释了大数据的概念和特征,但根据个人经验,如果我们首先了解数据的概念和特征,那么对我.._大数据的由来

reids基本数据类型_rendis数据类型-程序员宅基地

文章浏览阅读70次。Redis 有 5 种基础数据结构,分别为:string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合)。String(字符串)字符串 string 是 Redis 最简单的数据结构。Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据。不同类型的数据结构的差异就在于 value 的结构不一样。字符串结构使用非常广泛,一个常见的用途就是缓存用户信息。我们将用户信息结构体使用 J_rendis数据类型

element tree的开发使用-程序员宅基地

文章浏览阅读3.7k次。element tree的开发使用1.树的插槽,实现右边点击三个点打开操作的效果[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1elwKCTY-1649657408457)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\1649641603747.png)]<div class="el-tree-box"> <el-tree class="filter_element tree

UML之顺序图_uml顺序图-程序员宅基地

文章浏览阅读2.7w次,点赞32次,收藏208次。UML顺序图所表达的正是这种基于时间的动态交互。顺序图能够加强产品经理、开发、测试之间对系统功能的进一步了解,通过顺序图我们能够全貌的了解到系统的流程,为我们后续进行测试设计打下了坚实的基础。顺序图除了能够对需求进行分析外,还可以完成很多我们工作上的其他内容,譬如梳理部门的工作流规范(Bug流程、提测流程、用例评审流程、用例编写流程等),甚至可以对部门角色的职能描述。_uml顺序图

cmake 使用pkg-config配置第三方库和头文件_cmake pkg-config-程序员宅基地

文章浏览阅读6.6k次。pkg-configFindPkgConfigpkg-config --libs --cflags libpng–libs 指定库–cflags 指定头文件_cmake pkg-config

使用regasm注册 net com组件出现不是有效的 net程序集的解决办法_regasm : error ra0000 : “d:\com\hslplccom.dll”不是有效-程序员宅基地

文章浏览阅读2.4k次。使用regasm注册 net com组件出现不是有效的 net程序集的解决办法_regasm : error ra0000 : “d:\com\hslplccom.dll”不是有效的 .net 程序集,因此

推荐文章

热门文章

相关标签