原文路径: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);

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

被折叠的 条评论
为什么被折叠?



