Glide-自定义模块功能(七)
来源:互联网 发布:数据制作分析报表 编辑:程序博客网 时间:2024/06/06 06:37
Glide的用法是非常非常简单的,大多数情况下,我们想要实现的图片加载效果只需要一行代码就能解决了。但是Glide过于简洁的API也造成了一个问题,就是如果我们想要更改Glide的某些默认配置项应该怎么操作呢?很难想象如何将更改Glide配置项的操作串联到一行经典的Glide图片加载语句中当中吧?没错,这个时候就需要用到自定义模块功能了
自定义模块功能可以将更改Glide配置,替换Glide组件等操作独立出来,使得我们能轻松地对Glide的各种配置进行自定义,并且又和Glide的图片加载逻辑没有任何交集,这也是一种低耦合编程方式的体现
首先需要定义一个我们自己的模块类,并让它实现GlideModule接口
public class MyGlideModule implements GlideModule { @Override public void applyOptions(Context context, GlideBuilder builder) { } @Override public void registerComponents(Context context, Glide glide) { }}
这两个方法分别就是用来更改Glide和配置以及替换Glide组件的。我们待会儿只需要在这两个方法中加入具体的逻辑,就能实现更改Glide配置或者替换Glide组件的功能了
不过,目前Glide还无法识别我们自定义的MyGlideModule,如果想要让它生效,还得在AndroidManifest.xml文件当中加入如下配置才行:
<manifest> <application> <meta-data android:name="com.xy.test.MyGlideModule" android:value="GlideModule"/> ...... </application></manifest>
在标签中加入一个meta-data配置项,其中android:name指定成我们自定义的MyGlideModule的完整路径,android:value必须指定成GlideModule,这个是固定值
果想要更改Glide的默认配置,其实只需要在applyOptions()方法中提前将Glide的配置项进行初始化就可以了。那么Glide一共有哪些配置项呢
setMemoryCache()
用于配置Glide的内存缓存策略,默认配置是LruResourceCachesetBitmapPool()
用于配置Glide的Bitmap缓存池,默认配置是LruBitmapPoolsetDiskCache()
用于配置Glide的硬盘缓存策略,默认配置是InternalCacheDiskCacheFactorysetDiskCacheService()
用于配置Glide读取缓存中图片的异步执行器,默认配置是FifoPriorityThreadPoolExecutor,也就是先入先出原则setResizeService()
用于配置Glide读取非缓存中图片的异步执行器,默认配置也是FifoPriorityThreadPoolExecutorsetDecodeFormat()
用于配置Glide加载图片的解码模式,默认配置是RGB_565
其实Glide的这些默认配置都非常科学且合理,使用的缓存算法也都是效率极高的,因此在绝大多数情况下我们并不需要去修改这些默认配置,这也是Glide用法能如此简洁的一个原因
下面就通过具体的实例来看一下吧。刚才说到,Glide默认的硬盘缓存策略使用的是InternalCacheDiskCacheFactory,这种缓存会将所有Glide加载的图片都存储到当前应用的私有目录下。这是一种非常安全的做法,但同时这种做法也造成了一些不便,因为私有目录下即使是开发者自己也是无法查看的,如果我想要去验证一下图片到底有没有成功缓存下来,这就有点不太好办了
这种情况下,就非常适合使用自定义模块来更改Glide的默认配置。我们完全可以自己去实现DiskCache.Factory接口来自定义一个硬盘缓存策略,不过却大大没有必要这么做,因为Glide本身就内置了一个ExternalCacheDiskCacheFactory,可以允许将加载的图片都缓存到SD卡
那么接下来,我们就尝试使用这个ExternalCacheDiskCacheFactory来替换默认的InternalCacheDiskCacheFactory,从而将所有Glide加载的图片都缓存到SD卡上
public class MyGlideModule implements GlideModule { @Override public void applyOptions(Context context, GlideBuilder builder) { builder.setDiskCache(new ExternalCacheDiskCacheFactory(context)); } @Override public void registerComponents(Context context, Glide glide) { }}
现在所有Glide加载的图片都会缓存到SD卡上了
另外,InternalCacheDiskCacheFactory和ExternalCacheDiskCacheFactory的默认硬盘缓存大小都是250M。也就是说,如果你的应用缓存的图片总大小超出了250M,那么Glide就会按照DiskLruCache算法的原则来清理缓存的图片
当然,我们是可以对这个默认的缓存大小进行修改的,而且修改方式非常简单,如下所示:
public class MainActivity extends Activity { ImageView imageView; Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = findViewById(R.id.button); imageView = findViewById(R.id.image); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String url = "https://www.baidu.com/img/bd_logo1.png"; Glide.with(getBaseContext()).load(url).into(imageView); } }); }}
只需要向ExternalCacheDiskCacheFactory或者InternalCacheDiskCacheFactory再传入一个参数就可以了,现在我们就将Glide硬盘缓存的大小调整成了500M
默认情况下,Glide的缓存是在以下路径(模拟机中)
按照以上代码修改后,缓存路径改为了
这里有两个文件,其中journal文件是DiskLruCache算法的日志文件,这个文件必不可少,且只会有一个
而另外一个文件就是那张缓存的图片了,它的文件名虽然看上去很奇怪,但是我们只需要把这个文件的后缀改成.png,结果就一目了然了:
由此证明,我们已经成功将Glide的硬盘缓存路径修改到SD卡上了
Glide加载图片的默认格式是RGB_565,而Picasso加载图片的默认格式是ARGB_8888。ARGB_8888格式的图片效果会更加细腻,但是内存开销会比较大。而RGB_565格式的图片则更加节省内存,但是图片效果上会差一些
Glide和Picasso各自采取的默认图片格式谈不上熟优熟劣,只能说各自的取舍不一样。但是如果你希望Glide也能使用ARGB_8888的图片格式,这当然也是可以的。我们只需要在MyGlideModule中更改一下默认配置即可,如下所示:
public class MyGlideModule implements GlideModule { public static final int DISK_CACHE_SIZE = 500*1024*1024; @Override public void applyOptions(Context context, GlideBuilder builder) { builder.setDiskCache(new ExternalCacheDiskCacheFactory(context,DISK_CACHE_SIZE)); builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888); } @Override public void registerComponents(Context context, Glide glide) { }}
通过这样配置之后,使用Glide加载的所有图片都将会使用ARGB_8888的格式,虽然图片质量变好了,但同时内存开销也会明显增大,所以你要做好心理准备哦
替换Glide组件
替换Glide组件功能需要在自定义模块的registerComponents()方法中加入具体的替换逻辑。相比于更改Glide配置,替换Glide组件这个功能的难度就明显大了不少。Glide中的组件非常繁多,也非常复杂,但其实大多数情况下并不需要我们去做什么替换。不过,有一个组件却有着比较大的替换需求,那就是Glide的HTTP通讯组件
默认情况下,Glide使用的是基于原生HttpURLConnection进行订制的HTTP通讯组件,但是现在大多数的Android开发者都更喜欢使用OkHttp,因此将Glide中的HTTP通讯组件修改成OkHttp的这个需求比较常见,那么今天我们也会以这个功能来作为例子进行讲解
郭大侠原文地址
http://blog.csdn.net/guolin_blog/article/details/78179422
- Glide-自定义模块功能(七)
- 探究Glide的自定义模块功能
- Glide系列之六:探究Glide的自定义模块功能
- Android图片加载框架最全解析(六),探究Glide的自定义模块功能
- Android图片加载框架最全解析(六),探究Glide的自定义模块功能
- Android图片加载框架最全解析(六),探究Glide的自定义模块功能
- Android图片加载框架最全解析(六),探究Glide的自定义模块功能
- Android图片加载框架Glide之Glide的自定义模块
- Glide进阶详解(七)
- Glide系列之七:实现带进度的Glide图片加载功能
- Android图片加载框架最全解析(七),实现带进度的Glide图片加载功能
- Android图片加载框架最全解析(七),实现带进度的Glide图片加载功能
- Android图片加载框架最全解析(七),实现带进度的Glide图片加载功能
- XHTML 模块(七)
- Dongle烧写模块重构(七)-加入当前已有的Dongle烧写功能
- Glide图片框架使用详细介绍(三)自定义glide以及图片处理自定义transform
- (七)-自定义UITableViewCell
- 封装篇——图片模块(Glide)
- UML之用例图分析(关联、泛化、包含、扩展)(转)
- z-index(元素覆盖层级关系)
- 【模板】高精度
- 寻找二叉树的第k大节点
- 非典型 JavaMail 邮件附件名乱码问题
- Glide-自定义模块功能(七)
- Java实现基于LinkedList的栈
- 响应式布局三种实现方案汇总
- Linux系统调用(syscall)原理
- 【模板】手写堆
- VB 学习整理4
- 机器人操作系统
- fatal error: caffe/proto/caffe.pb.h: No such file or directory
- permgen space tomcat