GlideModule是3.x就有的,而AppGlideModule和Generated API是4.x才有的功能。
GlideModule已经废弃,替代的是AppGlideModule这个类。并且有了新功能Generated API。Generated API功能非常的好用,下面会给出例子,主要作用就是用来替换原来的RequestOption的写法,Glide觉得这种写法还可以再改进,于是就有了Generated API。
因为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()));
}
}
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。里面的代码是我们非常的常见的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是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实现的。性能更好。
文章浏览阅读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 驱动
文章浏览阅读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修改像素点五、获取图像属性形状像素数目图像类型六..._计算机视觉与图像处理
文章浏览阅读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过拟合怎么解决
文章浏览阅读102次。【代码】go上传文件。
文章浏览阅读2.9k次。_分辨率0.5的ad芯片
文章浏览阅读215次。 成为JavaGC专家Part II :如何监控Java垃圾回收机制 本文是成为Java GC专家系列文章的第二篇。在第一篇《深入浅出Java垃圾回收机制》中我们学习了不同GC算法的执行过程,GC是如何工作的,什么是新生代和老年代,你应该了解的JDK7中的5种GC类型,以及这5种类型对于应用性能的影响。 在本文中,我将解释JVM到底是如何执行垃圾回收处理..._成为javagc专家part ii — 如何监控java垃圾回收机制。
文章浏览阅读122次。文章目录python学习导航线一、seleniumpython-selenium二、python基础知识python的聊天室python学习导航线一、seleniumpython-selenium二、python基础知识python的聊天室_python点线导航
文章浏览阅读3.4k次,点赞4次,收藏22次。静态成员静态成员都是用static修饰,它的特点是不论创建多少个对象,程序都只创建一个静态成员。最主要的特点:共享什么是共享呢?例如:统计超市中所有商品数量的总和,商品数量的总和是随着每一个数量的变化而变化的,这是我们就可以用静态成员处理。(代码下面有写)静态成员又分为静态成员变量和静态成员函数。(一)静态成员变量特点:1、所有对象共享一份数据。 2、在编译阶段分配内存。 3、类内声明,类外初始化。#include<io..._静态成员变量
文章浏览阅读879次,点赞21次,收藏20次。1 网页简介:基于HTML+CSS+JavaScript 制作七夕情人节表白网页、生日祝福、七夕告白、 求婚、浪漫爱情3D相册、炫酷代码,快来制作一款高端的表白网页送(他/她)浪漫的告白,制作修改简单,可自行更换背景音乐,文字和图片即可使用等任意html编辑软件进行运行及修改编辑等操作)。_html 满屏爱心
文章浏览阅读492次,点赞9次,收藏5次。【代码】【易飞】易飞ERP自动审核程序功能。_易飞单据审批设置
文章浏览阅读1.6k次,点赞15次,收藏30次。文件打开是一个print数组v4的地址和read函数,并且nx好像可写,输入长度可以利用,进行一个栈上写好自己的shell,然后在构造一个回到v4的地址,这样子就可以重新读取到写buf段上的shell,这里要注意shell的隔断用/00截断然后构造好栈上数据。一个sql注入题目,尝试使用二分查找,但只能爆出表名和列名,值一直出不来,后来采用布尔盲注,fuzz测试后发现没有加任何过滤,直接写脚本。第二题:为了求解方程 (5 + sqrt{x} = 8),我们可以分离平方根项,然后求解 (x)。_xyctf高校新生联合赛 2024