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

智能推荐

如何把自己的驱动编译进内核或模块(Kconfig和Makefile)_nvp6324 驱动-程序员宅基地

文章浏览阅读905次。本说明以NVP6324为例。1、首先在drivers\media\i2c中修改Kconfig和Makefile,如下: 在Kconfig中添加如下:config VIDEO_NVP6324 tristate "NVP6324 AHD sensor support" depends on I2C ---help--- This is a V4L2 sensor-le..._nvp6324 驱动

自适应直方图均衡(CLAHE) 代码及详细注释【OpenCV】_自适应双平台直方图均衡算法代码-程序员宅基地

文章浏览阅读2.7w次,点赞9次,收藏80次。理论请参考博客OpenCV源码的本地路径: %OPENCV%\opencv\sources\modules\imgproc\src\clahe.cppclahe.cpp// ----------------------------------------------------------------------// CLAHEnamespace{ class C_自适应双平台直方图均衡算法代码

计算机视觉及其图像处理操作-程序员宅基地

文章浏览阅读3.1k次,点赞3次,收藏22次。点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达作者丨吃猫的鱼python @CSDN编辑丨3D视觉开发者社区目录content一、什么是计算机视觉二、图片处理基础操作图片处理:读入图像图片处理:显示图像图片处理:图像保存三、图像处理入门基础图像成像原理介绍图像分类四、像素处理操作读取像素修改像素使用python中的numpy修改像素点五、获取图像属性形状像素数目图像类型六..._计算机视觉与图像处理

欠拟合、过拟合现象,及解决办法_svm过拟合怎么解决-程序员宅基地

文章浏览阅读7.4k次,点赞6次,收藏112次。@创建于:2022.05.27@修改于:2022.05.27文章目录1、过拟合与欠拟合2、欠拟合2.1 出现的原因2.2 解决的办法3、过拟合3.1 出现的原因3.2 解决的办法4. Early stopping5、Dropout6、L1 和 L2 正则化7、参考资料1、过拟合与欠拟合机器学习中模型的泛化能力强的模型才是好模型。对于训练好的模型:若在训练集表现差,不必说在测试集表现同样会很差,这可能是欠拟合导致;若模型在训练集表现非常好,却在测试集上差强人意,则这便是过拟合导致的。过拟合_svm过拟合怎么解决

go上传文件-程序员宅基地

文章浏览阅读102次。【代码】go上传文件。

【转】目前常用AD/DA芯片简介_分辨率0.5的ad芯片-程序员宅基地

文章浏览阅读2.9k次。_分辨率0.5的ad芯片

随便推点

成为JavaGC专家Part II:如何监控Java垃圾回收机制-程序员宅基地

文章浏览阅读215次。 成为JavaGC专家Part II :如何监控Java垃圾回收机制 本文是成为Java GC专家系列文章的第二篇。在第一篇《深入浅出Java垃圾回收机制》中我们学习了不同GC算法的执行过程,GC是如何工作的,什么是新生代和老年代,你应该了解的JDK7中的5种GC类型,以及这5种类型对于应用性能的影响。 在本文中,我将解释JVM到底是如何执行垃圾回收处理..._成为javagc专家part ii — 如何监控java垃圾回收机制。

python学习导航线_python点线导航-程序员宅基地

文章浏览阅读122次。文章目录python学习导航线一、seleniumpython-selenium二、python基础知识python的聊天室python学习导航线一、seleniumpython-selenium二、python基础知识python的聊天室_python点线导航

静态成员-静态成员变量-程序员宅基地

文章浏览阅读3.4k次,点赞4次,收藏22次。静态成员静态成员都是用static修饰,它的特点是不论创建多少个对象,程序都只创建一个静态成员。最主要的特点:共享什么是共享呢?例如:统计超市中所有商品数量的总和,商品数量的总和是随着每一个数量的变化而变化的,这是我们就可以用静态成员处理。(代码下面有写)静态成员又分为静态成员变量和静态成员函数。(一)静态成员变量特点:1、所有对象共享一份数据。 2、在编译阶段分配内存。 3、类内声明,类外初始化。#include<io..._静态成员变量

HTML5七夕情人节表白网页制作【情人节满屏爱心HTML5特效】HTML+CSS+JavaScript html生日快乐祝福网页制作_html 满屏爱心-程序员宅基地

文章浏览阅读879次,点赞21次,收藏20次。1 网页简介:基于HTML+CSS+JavaScript 制作七夕情人节表白网页、生日祝福、七夕告白、 求婚、浪漫爱情3D相册、炫酷代码,快来制作一款高端的表白网页送(他/她)浪漫的告白,制作修改简单,可自行更换背景音乐,文字和图片即可使用等任意html编辑软件进行运行及修改编辑等操作)。_html 满屏爱心

【易飞】易飞ERP自动审核程序功能_易飞单据审批设置-程序员宅基地

文章浏览阅读492次,点赞9次,收藏5次。【代码】【易飞】易飞ERP自动审核程序功能。_易飞单据审批设置

青少年CTF擂台挑战赛 2024 #Round 1_xyctf高校新生联合赛 2024-程序员宅基地

文章浏览阅读1.6k次,点赞15次,收藏30次。文件打开是一个print数组v4的地址和read函数,并且nx好像可写,输入长度可以利用,进行一个栈上写好自己的shell,然后在构造一个回到v4的地址,这样子就可以重新读取到写buf段上的shell,这里要注意shell的隔断用/00截断然后构造好栈上数据。一个sql注入题目,尝试使用二分查找,但只能爆出表名和列名,值一直出不来,后来采用布尔盲注,fuzz测试后发现没有加任何过滤,直接写脚本。第二题:为了求解方程 (5 + sqrt{x} = 8),我们可以分离平方根项,然后求解 (x)。_xyctf高校新生联合赛 2024

推荐文章

热门文章

相关标签