当前位置:网站首页>GlideModule AppGlideModule和Generated API详解
GlideModule AppGlideModule和Generated API详解
2022-07-24 21:48:00 【ScottePerk】
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实现的。性能更好。
边栏推荐
- Calling Laser Galvanometer control in the application and development tutorial of motion control card
- Win10 解base64
- Shell introduction and variable definition
- Feeding Program Source Code to ZK VMs
- Huawei Router: basic principle and configuration of Isis (including experiment)
- What is the database account in DTS?
- Gradle 学习 ----Gradle 入门
- 【南瓜书ML】(task4)神经网络中的数学推导
- Esp32485 air temperature and humidity test
- What problems should be paid attention to when using a database without public ip: port?
猜你喜欢

RISC0:Towards a Unified Compilation Framework for Zero Knowledge
![[e-commerce operation] teach you these tips to bid farewell to invalid preset replies](/img/5b/6682c613305deb3dc15401077d38a0.png)
[e-commerce operation] teach you these tips to bid farewell to invalid preset replies

【ICML2022】气候变化与机器学习:机遇、挑战与考虑,121页ppt

Conditional judgment of Shell Foundation

运动控制卡应用开发教程之调用激光振镜控制

图像处理笔记(1)图像增强

Applet location interface application

Easily make 2D tile map with unity tilemap - Basics

【考研词汇训练营】Day 12 —— native,separate,figure,contribute,species,assumption,suppose

Gradle 学习 ----Gradle 入门
随机推荐
使用frp实现内网穿透
Gradle 学习 ----Gradle 入门
Drawing library Matplotlib drawing
Use of templates
2022 Tsinghua summer school notes L1_ NLP and bigmodel Foundation
Binary search
RISC0:Towards a Unified Compilation Framework for Zero Knowledge
Image processing notes (1) image enhancement
Microcomputer principle: detailed explanation of CPU architecture
Composability and Recursion in snarkyJS
2018mysql technology Q & a collection, hoping to give some help to students who like MySQL
图像处理笔记(1)图像增强
《论文复现》BiDAF代码实现过程(4)模型训练+验证
How much does it cost to build your own personal server
Kubernetes v1.24 is deployed based on containerd
Feeding Program Source Code to ZK VMs
Leetcode 101. symmetric binary tree
Machine learning kmeans
陈春花与莫言,都有苦难言
What are the source database types supported by Alibaba cloud DTS?