Glide源码学习七:自定义模块功能,androidstudio开发app实例

本文介绍了如何在Android Studio中自定义Glide模块,将图片加载库Glide的硬盘缓存路径改到SD卡,并详细讲解了如何替换Glide的HTTP通讯组件为OkHttp,包括手动替换和使用官方提供的简便方法。通过替换,你可以利用OkHttp的性能优势提高图片加载速度。
摘要由CSDN通过智能技术生成

OK,现在图片已经加载出现了,那么我们去找一找它的缓存吧。

ExternalCacheDiskCacheFactory的默认缓存路径是在sdcard/Android/包名/cache/image_manager_disk_cache目录当中,我们使用文件浏览器进入到这个目录,结果如下图所示。

可以看到,这里有两个文件,其中journal文件是DiskLruCache算法的日志文件,这个文件必不可少,且只会有一个。想了解更多关于DiskLruCache算法的朋友,可以去阅读我的这篇博客 Android DiskLruCache完全解析,硬盘缓存的最佳方案 。

而另外一个文件就是那张缓存的图片了,它的文件名虽然看上去很奇怪,但是我们只需要把这个文件的后缀改成.png,然后用图片浏览器打开,结果就一目了然了,如下图所示。

由此证明,我们已经成功将Glide的硬盘缓存路径修改到SD卡上了。

另外这里再提一点,我们都知道Glide和Picasso的用法是非常相似的,但是有一点差别却很大。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组件。

替换Glide组件

=========

替换Glide组件功能需要在自定义模块的registerComponents()方法中加入具体的替换逻辑。相比于更改Glide配置,替换Glide组件这个功能的难度就明显大了不少。Glide中的组件非常繁多,也非常复杂,但其实大多数情况下并不需要我们去做什么替换。不过,有一个组件却有着比较大的替换需求,那就是Glide的HTTP通讯组件。

默认情况下,Glide使用的是基于原生HttpURLConnection进行订制的HTTP通讯组件,但是现在大多数的Android开发者都更喜欢使用OkHttp,因此将Glide中的HTTP通讯组件修改成OkHttp的这个需求比较常见,那么今天我们也会以这个功能来作为例子进行讲解。

首先来看一下Glide中目前有哪些组件吧,在Glide类的构造方法当中,如下所示:

public class Glide {

Glide(Engine engine, MemoryCache memoryCache, BitmapPool bitmapPool, Context context, DecodeFormat decodeFormat) {

register(File.class, ParcelFileDescriptor.class, new FileDescriptorFileLoader.Factory());

register(File.class, InputStream.class, new StreamFileLoader.Factory());

register(int.class, ParcelFileDescriptor.class, new FileDescriptorResourceLoader.Factory());

register(int.class, InputStream.class, new StreamResourceLoader.Factory());

register(Integer.class, ParcelFileDescriptor.class, new FileDescriptorResourceLoader.Factory());

register(Integer.class, InputStream.class, new StreamResourceLoader.Factory());

register(String.class, ParcelFileDescriptor.class, new FileDescriptorStringLoader.Factory());

register(String.class, InputStream.class, new StreamStringLoader.Factory());

register(Uri.class, ParcelFileDescriptor.class, new FileDescriptorUriLoader.Factory());

register(Uri.class, InputStream.class, new StreamUriLoader.Factory());

register(URL.class, InputStream.class, new StreamUrlLoader.Factory());

register(GlideUrl.class, InputStream.class, new HttpUrlGlideUrlLoader.Factory());

register(byte[].class, InputStream.clas

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值