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的内存缓存策略,默认配置是LruResourceCache

  • setBitmapPool()
    用于配置Glide的Bitmap缓存池,默认配置是LruBitmapPool

  • setDiskCache()
    用于配置Glide的硬盘缓存策略,默认配置是InternalCacheDiskCacheFactory

  • setDiskCacheService()
    用于配置Glide读取缓存中图片的异步执行器,默认配置是FifoPriorityThreadPoolExecutor,也就是先入先出原则

  • setResizeService()
    用于配置Glide读取非缓存中图片的异步执行器,默认配置也是FifoPriorityThreadPoolExecutor

  • setDecodeFormat()
    用于配置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

阅读全文
0 0