Glide使用探索(三)——配置

本文介绍了如何通过实现GlideModule接口配置Glide,包括内存缓存与图片池的大小设置,磁盘缓存的位置及大小调整等内容。此外还详细说明了如何避免模块间的冲突。

原文路径:https://github.com/bumptech/glide/wiki/Configuration
一、便捷配置:
Glide3.5后,可以通过实现GlideModule接口便捷地配置Glide,也可以像ModelLoaders般自动注册组件。
1.创建一个GlideModule:
使用并注册GlideModule,首先需要实现它(可以实现任意多个GlideModule)。

            public class MyGlideModule implements GlideModule {

                        @Override 
                        public void applyOptions(Context context, GlideBuilder builder) {
                                    // Apply options to the builder here.
                        }

                        @Override 
                        public void registerComponents(Context context, Glide glide) {
                                   // register ModelLoaders here.
                        }
            }

2.防止混淆:
将实现的类添加到混淆文件中以保证其可以通过反射实例化。用于反射的性能开销是很小的,因为每一个module都是在Gilde创建并发送第一次请求时单独创建的。

3.注册:
需要在AndroidManifest.xml中注册module以便Glide可以找到

     <meta-data
                 android:name="com.mypackage.MyGlideModule"
                 android:value="GlideModule" />

4.Library项目:
外部依赖项目可能会定义一个或多个GlideModule。若外部依赖将module加入它本身的manifest中,那么依赖它的项目通过Gradle(或其他包含manifest合并功能的系统)构建应用时就会自动合入外部依赖中的module。如果没有可用的manifest合并,就需要手动将外部依赖中的module加入到依赖它的应用的manifest中。

5.GlideModules冲突:
尽管Glide允许每个应用注册多个GlideModule,但它并不会以特定顺序调用它们。因此,用户需要负责避免应用中定义的多个module间的冲突(或多个lib库中定义的module)。
若冲突无法避免,应用需要定义默认的自身的module去手动解决冲突,并将其提供给所有的外部依赖库。Gradle用户(或其他有manifest合并功能的用户),可以通过在AndroidManifest中加入tools:node=”remove”标签来排除冲突的module。

二、全局配置:

Glide可以为所有的请求配置许多不同的全局选项。可以通过GlideModule#applyOptions中提供的GlideBuilder来实现配置。

1.磁盘缓存:
通过GlideBuilder的setDiskCache()方法设置磁盘缓存的位置或最大缓存值。同样可以通过使用DiskCacheAdapter或自定义的DiskCache接口来彻底地禁止缓存。磁盘缓存通过在后台调用DiskCache.Factory接口构建(以避免违反Android的严谨模式)
Glide默认使用InternalCacheDiskCacheFatory构建磁盘缓存。这个模式将以应用的内部存储作为磁盘缓存的位置(/data/data/yourpackagename/cache/image_manager_disk_cache),并设置最大缓存值为250MB。使用内部存储可以保证其他应用使用本应用下载的图片。
1) 大小:可通过InternalCacheDiskCacheFactory设置磁盘缓存的大小:
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, yourSizeInBytes));
2) 位置:可以通过内置的IntegerCacheDiskCacheFactory将缓存路径设置在应用的内部存储中。

builder.setDiskCache(new InternalCacheDiskCacheFactory(context, cacheDircotyName, yourSizeInBytes));
(注:InternalCacheDiskCacheFactory通过Context.getCacheDir()获取根路径,
因此图片缓存的路径是在/data/data/yourpackagename/cache/cacheDirectoryName/)

    也可以通过ExternalCacheDiskCacheFactory将缓存路径设置在外部存储中。
builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, cacheDirectoryName, yourSizeInBytes));

(注:ExternalCacheDiskCacheFactory通过Context.getExternalCacheDir()
    获取根路径,因此图片缓存的路径是在
    /sdcard/Android/data/yourpackagename/cache/cacheDirectoryName/)

    如果需要使用其他自定义位置,则需要使用DiskLruCacheFactory。
// If you can figure out the folder without I/O:
// Calling Context and Environment class methods usually do I/O.
builder.setDiskCache(
  new DiskLruCacheFactory(getMyCacheLocationWithoutIO(), yourSizeInBytes));

// In case you want to specify a cache folder ("glide"):
builder.setDiskCache(
  new DiskLruCacheFactory(getMyCacheLocationWithoutIO(), "glide", yourSizeInBytes));

// In case you need to query the file system while determining the folder:
builder.setDiskCache(new DiskLruCacheFactory(new CacheDirectoryGetter() {
@Override public File getCacheDirectory() {
    return getMyCacheLocationBlockingIO();
}
}), yourSizeInBytes);

注意:任何硬编码的值都不推荐,尤其从Android4.2之后(开始支持多用户)。

可以通过实现DiskCache.Factory接口实现完全控制缓存的创建,并使用DiskLruCacheWrapper
在期望的位置创建缓存。
builder.setDiskCache(new DiskCache.Factory() {
    @Override 
    public DiskCache build() {
        File cacheLocation = getMyCacheLocationBlockingIO();
        cacheLocation.mkdirs();
        return DiskLruCacheWrapper.get(cacheLocation, yourSizeInBytes);
    }
}

2.内存缓存与图片池:
GlideBuilder允许通过MemoryCache与BitmapPool接口设置内部缓存与图片池的大小。
1) 大小:
默认大小由MemorySizeCalculator决定。MemorySizeCalculator通过给定设备的屏幕尺寸以及可用的内存大小计算出合理的大小。可以通过构建自定义实例来调整默认值:
MemorySizeCalculator calculator = new MemorySizeCalculator(context);
int defaultMemoryCacheSize = calculator.getMemoryCacheSize();
int defaultBitmapPoolSize = calculator.getBitmapPoolSize();
如果希望在应用中动态地调整Glide的内存大小,可以通过在setMemoryCategory()中传入MemoryCategory的值。
Glide.get(context).setMemoryCateGory(MemoryCategory.HIGH);

注:MemorySizeCalculator默认大小计算方法:
maxSize = 每个进程最大可用内存字节数 * (0.33f或者0.4f)  
(乘式结果取整,如果是低内存设备选0.33f,否则选0.4f),maxSize即Glide最大能使用的内存值
screenSize = screenWidth像素值 * screenHeight像素值 * AGRB_8888每像素的字节数(4)
targetPoolSize = screenSize * 默认图片池占据的屏幕数(4)    
targetMemoryCacheSize = screenSize * 默认内部缓存占据的屏幕数(2)
(图片池默认缓存4屏大小的数据,内部缓存默认缓存2屏大小的数据)
如果targetPoolSize + targetMemoryCacheSize小于等于maxSize,则默认的图片池与内部缓存大小
分别是targetPoolSize与targetMemoryCacheSize;
否则,就按照默认图片池占据的屏幕数(4)与默认内部缓存占据的屏幕数(2)的比例分配maxSize
part = maxSize / (默认图片池占据的屏幕数(4) + 默认内部缓存占据的屏幕数(2)) (值取整)
图片池大小 = part * 默认图片池占据的屏幕数(4)
默认内部缓存大小 = part * 默认内部缓存占据的屏幕数(2)

2)内部缓存:
    Glide的内部缓存用来在内存中缓存数据,如此这些资源就能够被立即使用而不需要通过IO。
    可以使用GlideBuilder的setMemoryCache()方法设置缓存大小,也可以自己实现内部缓存方法。
    LruResourceCache类是默认的实现,可以在LruResourceCache构造中传入希望的内部缓存占用内存
    的最大值。builder.setMemoryCache(new LruResourceCache(yourSizeInBytes));

3) 图片池(BitmapPool):
    Glide的图片池用于复用不同尺寸的bitmap,这样基本上可以避免包括当图片解码时,由像素数组分配引起
    的垃圾回收等jank(卡顿)现象。
    可以通过GlideBuilder的setBitmapPool()方法设置图片池大小,也可以自己实现图片池。
    LruBitmapPool是默认的图片池实现,LruBitmapPool使用Lru算法缓存最近以及最频繁使用的图片。
    可以通过在LruBitmapPool的构造中传值来设置图片池的最大值。
    builder.setBitmapPool(new LruBitmapPool(sizeInBytes);

4) 图片格式:
    GlideBuilder同样允许应用设置一个全局的优先图片格式。
    Glide默认使用RGB_565,因为其每像素点只占2字节(16位),因此它与ARGB_8888相比只占用了
    一半的内存资源。然而RGB_565在某些特定图片的显示上存在问题,同样它也不支持透明。
    如果在你的应用中存在显示问题或者需要更高质量的图片,可以通过GlideBuilder的
    setDecodeFromat方法设置DecodeFormat.ALWAYS_ARGB_8888作为Glide首先的图片格式。
    builder.setDecodeFormat(DecodeFormat.ALWAYS_ARGB_8888);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值