这篇文章给大家介绍下android目前使用比较广泛的一个图片缓存库—Glide,这个库是google的一位开发人员在github上的一个开源项目。目前google的一些官方应用都在使用它,所以你现在就开始放心的用吧。
github地址
Glide基础用法加缓存
添加Glide
在module的build.gradle中添加以下依赖:
compile 'com.github.bumptech.glide:glide:3.7.0'
高级功能
Glide.with(this).load(url).skipMemoryCacge(true).into(imageview);
//跳过磁盘缓存,只在内存缓存(NONE表示什么都不缓存)
Glide.with(this).load(url).diskCacheStrategy(DiskCacheStrategy.NONE).into(imageview);
//显示缩略图(显示原始图像的10%)
Glide.with(this).load(url).thumbnail(0.1f).into(imageview)
常用功能
Glide.with(this).load(url).placeholder(R.mipmap.ic_launcher).into(imageview);
//错误占位符
Glide.with(this).load(url).error(R.mipmap.ic_launcher).into(imageview);
//强制显示淡入淡出功能,300表示动画时间300ms
Glide.with(this).load(url).crossFade(300).into(imageview);
//不要淡入淡出效果
Glide.with(this).load(url).dontAnimate().into(imageview);
//改变图片大小,单位是pixel
Glide.with(this).load(url).override(500,500).into(imageview);
//Glide可以直接显示Gif
Glide.with(this).load(gif_url).into(imageview);
//也可以只显示Glide的第一帧作为普通图片使用
Glide.with(this).load(gif_url).asBitmap().into(imageview);
//也可以强制显示Gif,如果目标url不是gif则调用error()方法
Glide.with(this).load(gif_url).asGif().into(imageview);
//还可以显示视频,但目前只支持本地视频
Glide.with(this).load(Uri.fromFile(new File(local_video_path))).into(imageview);
Glide 加载图片监听
Glide.with(getActivity()).load(url)
.listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model,
Target<GlideDrawable> target,
boolean isFirstResource) {
// 可替换成进度条
Toast.makeText(getActivity(), "图片加载失败", Toast.LENGTH_SHORT).show();
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model,
Target<GlideDrawable> target,
boolean isFromMemoryCache,
boolean isFirstResource) {
// 图片加载完成,取消进度条
Toast.makeText(getActivity(), "图片加载成功", Toast.LENGTH_SHORT).show();
return false;
}
}).error(R.mipmap.ic_launcher_round)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(demo);
Glide 获取bitmap
Glide.with(getActivity()).load(url).asBitmap().skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.ALL).into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
Log.w("TAG", "secd------->" + resource.hashCode());
demo.setImageBitmap(resource);
}
}); //方法中设置asBitmap可以设置回调类型
```![11527749649_.pic.jpg](https://img.haomeiwen.com/i6970555/49796a9c0725d4ff.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
###Glide-内存缓存与磁盘缓存
Glide的缓存资源分为两种:
- 原图(SOURCE) :原始图片
- 处理图(RESULT) :经过压缩和变形等处理后的图片
内存缓存策略(skipMemoryCache)
Glide默认是会在内存中缓存处理图(RESULT)的.
可以通过调用skipMemoryCache(true)来设置跳过内存缓存
#####跳过内存缓存
>Glide.with(this).load(mUrl).skipMemoryCache(true).into(mIv);
磁盘缓存策略(diskCacheStrategy)
Glide的缓存读取顺序是 内存–>磁盘–>网络
Glide磁盘缓存策略分为四种,默认的是RESULT
- ALL:缓存原图(SOURCE)和处理图(RESULT)
- NONE:什么都不缓存
- SOURCE:只缓存原图(SOURCE)
- RESULT:只缓存处理图(RESULT) —默认值
磁盘缓存大小
**磁盘缓存大小: 250 * 1024 * 1024(250MB)**
/** 250 MB of cache. */
int DEFAULT_DISK_CACHE_SIZE = 250 * 1024 * 1024;
磁盘缓存目录
**默认磁盘缓存目录: 项目/cache/image_manager_disk_cache**
String DEFAULT_DISK_CACHE_DIR = "image_manager_disk_cache";
清除缓存
**清除所有内存缓存(需要在Ui线程操作)**
Glide.get(this).clearMemory();
**清除所有磁盘缓存(需要在子线程操作)**
Glide.get(MainActivity.this).clearDiskCache();
####Glide-通过Modules定制Glide
**创建一个类实现GlideModule**
public class WangGlideModule implements GlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
//TODO
}
@Override
public void registerComponents(Context context, Glide glide) {
//TODO
}
}
**配置清单文件**
**在AndroidManifest中配置刚刚创建的GlideModule,需要在application节点下添加**
<application>
...
<meta-data
android:name="com.demo.WangGlideModule"
android:value="GlideModule" />
</application>
**其中android:name就是刚才创建的GlideModule的实现类**
**进行自定义配置**
**刚才创建的GlideModule的实现类时,会要实现两个方法,这里要用到的是其中的applyOptions方法,applyOptions方法里面提供了一个GlideBuilder,通过GlideBuilder我们就能实现自定义配置了**
public class WangGlideModule implements GlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
builder.setDiskCache();//自定义磁盘缓存
builder.setMemoryCache();//自定义内存缓存
builder.setBitmapPool(); //自定义图片池
builder.setDiskCacheService();//自定义本地缓存的线程池
builder.setResizeService();//自定义核心处理的线程池
builder.setDecodeFormat();//自定义图片质量
}
@Override
public void registerComponents(Context context, Glide glide) {
//TO
}
}
**配置默认图片质量**
**用过Picasso的朋友应该知道,Picasso默认的图片质量是ARGB_8888,而Glide默认的图片质量是RGB_565,这里我们就来修改默认配置,让Glide的默认质量为ARGB_8888**
(ARGB_8888是指32位图,即每个像素占4byte)
(RGB_565是16位图,即每个像素占2byte)
public class WangGlideModule implements GlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
//自定义图片质量
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
}
@Override
public void registerComponents(Context context, Glide glide) {
//TO
}
}
##Glide-自定义缓存
**自定义内存缓存**
**通过调用builder的setXXX方法就可以自定义内存缓存的大小了**
(**MemoryCach**以及**BitmapPool**都与内存缓存有关)
public class WangGlideModule implements GlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
//配置内存缓存大小 10MB
builder.setMemoryCache(new LruResourceCache(10*1024*1024));
//配置图片池大小 20MB
builder.setBitmapPool(new LruBitmapPool(20*1024*1024));
}
@Override
public void registerComponents(Context context, Glide glide) {
}
}
**但是内存缓存的大小数值其实不应该是随便配置的,Glide的内部的默认值是通过一系列的计算获取的,比如说判断手机是否高配置手机等(有兴趣的可以去看他的源码,或者等待本系列后面的源码分析)**
**这样有个取巧的办法,就是获取Glide默认的设置,然后在这个设置的基础上进行修改**
public class WangGlideModule implements GlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
//获取内存计算器
MemorySizeCalculator calculator = new MemorySizeCalculator(context);
//获取Glide默认内存缓存大小
int defaultMemoryCacheSize = calculator.getMemoryCacheSize();
//获取Glide默认图片池大小
int defaultBitmapPoolSize = calculator.getBitmapPoolSize();
//将数值修改为之前的1.1倍
int myMemoryCacheSize = (int) (1.1 * defaultMemoryCacheSize);
int myBitmapPoolSize = (int) (1.1 * defaultBitmapPoolSize);
//修改默认值
builder.setMemoryCache(new LruResourceCache(myMemoryCacheSize));
builder.setBitmapPool(new LruBitmapPool(myBitmapPoolSize));
}
@Override
public void registerComponents(Context context, Glide glide) {
}
}
**自定义磁盘缓存**
磁盘缓存按照访问权限及路径可以分为两种
- 私有缓存 (自己本app可以使用,目录在data/data/应用包名 下面)
- 外部缓存(都可以访问,目录在扩展空间内,如SD卡)
* * *
**私有缓存**
**下面这样配置的话,主要是修改缓存大小,缓存路径仍为默认路径(即data/data/应用包名/cache/image_manager_disk_cache)**
public class WangGlideModule implements GlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
//设置磁盘缓存大小
int size = 100 * 1024 * 1024;
//设置磁盘缓存
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, size));
}
@Override
public void registerComponents(Context context, Glide glide) {
}
}
**如果需求修改缓存路径的话,需要增加一下参数即可(变为data/data/应用包名/cache/xiayu)**
//设置磁盘缓存大小
int size = 100 * 1024 * 1024;
String dir = "xiayu";
//设置磁盘缓存
builder.setDiskCache(new InternalCacheDiskCacheFactory(context,dir, size));
* * *
**外部缓存**
**下面这样配置的话,缓存会在 SDCard/Android/data/应用包名/cache/image_manager_disk_cache目录下**
public class WangGlideModule implements GlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
//设置磁盘缓存大小
int size = 100 * 1024 * 1024;
//设置磁盘缓存
builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, size));
}
@Override
public void registerComponents(Context context, Glide glide) {
}
}
**如果需求修改缓存路径的话,需要增加一下参数即可(变为SDCard/Android/data/应用包名/cache/xiayu)**
//设置磁盘缓存大小
int size = 100 * 1024 * 1024;
String dir = "xiayu";
//设置磁盘缓存
builder.setDiskCache(new ExternalCacheDiskCacheFactory(context,dir, size));
**私有缓存目录和外部缓存的目录的区别是**
`new ExternalCacheDiskCacheFactory`
`new InternalCacheDiskCacheFactory`
**完全自定义路径**
通过`new DiskLruCacheFactory`来实现
**上面两种缓存都是把缓存的父目录定死的,能够改变的只是子目录,Glide还提供了一种方式可以完全自定义缓存目录**
**(需要注意的是这里的路径是配置的绝对路径,所以如果没有指定在sd卡目录下的话是无法直接看到的)**
public class WangGlideModule implements GlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
//设置磁盘缓存大小
int size = 100 * 1024 * 1024;
String dirFolder = "GlideDisk";
String dirName = "wang";
//设置磁盘缓存
builder.setDiskCache(new DiskLruCacheFactory(dirFolder, size));
//builder.setDiskCache(new DiskLruCacheFactory(dirFolder, dirName,size));
}
@Override
public void registerComponents(Context context, Glide glide) {
}
运行后手机文件夹里面多出来一个GlideDisk文件夹,这个就是磁盘缓存的目录
31527749650_.pic.jpg 11527749649_.pic.jpg
网友评论