前言:
项目一直都是使用Picasso来实现图片加载和缓存,今天想试一试清除一下手机的图片缓存,发现根本找不到清除缓存的方法。
百度上很多人说Picasso.with(mContext).invalidate(uri);可以清除缓存,经过我一步一步调试和查看本地picasso-cache文件发现,这个方法清除的是内存的缓存。
要是路过的大神有解决的方法,还希望指点一下。
本文目录(只是基本的功能)
- 添加依赖
- 权限
- 加载显示图片
- placeholder & error
- 设置图片尺寸(override)、裁剪(crop)
- 获得加载图片的大小
- 缓存与清除缓存
正文
1.添加依赖
目前最新的版本
compile'com.github.bumptech.glide:glide:3.7.0'
2. 权限
3. 加载显示图片
最简单的使用
Glide.with(getContext())
.load("http://cn.bing.com/az/hprichbg/rb/Dongdaemun_ZH-CN10736487148_1920x1080.jpg")
.into(imageDetail);
load()方法有多个重载,分别支持File,Byte[],String,Uri,Integer(本地资源图片)
4. placeholder & error
当加载网络图片的时候可能会比较慢,或者无网络,就可以使用placaholder展位图和error错误图友好的显示默认图片。
Glide.with(getContext())
.load("http://cn.bing.com/az/hprichbg/rb/Dongdaemun_ZH-CN10736487148_1920x1080.jpg")
.placeholder(R.drawable.default_image)
.error(R.drawable.error_image)
.into(imageDetail);
5. 设置图片尺寸(override)、裁剪(crop)
设置尺寸,Picasso是resize,Glide是override,参数和效果还是一样的。
默认是px喔,大家记得dp转换成px值。
Glide.with(getContext())
.load("http://cn.bing.com/az/hprichbg/rb/Dongdaemun_ZH-CN10736487148_1920x1080.jpg")
.override(500, 300)
.into(imageDetail);
裁剪,Picasso有centerCrop(),fit(),Glide也有centerCrop(),fitCrop()
还以为效果是一样的结果发现,很不同!!
Picasso
**1. centerCrop **
充满ImageView 的边界,居中裁剪。
2. fit
充满屏幕,会拉伸。
Glide
**1. centerCrop **
等比例缩放图片,直到图片的狂高都大于等于ImageView的宽度,然后截取中间的显示。
2. fitCrop
等比例缩放图片,宽或者是高等于ImageView的宽或者是高。
项目中想图片布满整个ImageView发现Glide没有对应的方法,最后就改了ImageView的ScaleType为FIT_XY
6. 获得加载图片的大小
项目中使用PhotoView控件进行图片缩放,PhotoView当显示的图片宽度或者高度像素大于4000就要关闭硬件加速。于是加载图片后先判断图片是否像素是否大于4000,再进行显示。
(现在手机随便拍一个照片宽度或者高度都大于4000像素)
Glide.with(getContext())
.load(url)
.asBitmap()
.into(new SimpleTarget(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL){
@Override
public void onResourceReady(Bitmap resource, GlideAnimation super Bitmap> glideAnimation) {
if(imageDetail != null){
if(isBigPicture(resource.getWidth(), resource.getHeight())){
imageDetail.setLayerType(View.LAYER_TYPE_SOFTWARE, null);//关闭硬件加速
}
Glide.with(getContext())
.load(url)
.into(photoView);
}
}
});
7. 缓存与清除缓存
Glide的图片缓存在/data/data/项目包名/cache/image_manager_disk_cache文件夹下
网上复制了一份清除缓存的代码,测试过是可以的
public class GlideCacheUtil {
private static GlideCacheUtil instance;
public static GlideCacheUtil getInstance(){
if(instance == null){
instance = new GlideCacheUtil();
}
return instance;
}
/**
* 清理图片磁盘缓存
*/
public void clearImageDiskCache(final Context context){
try{
if(Looper.myLooper() == Looper.getMainLooper()){
new Thread(new Runnable() {
@Override
public void run() {
Glide.get(context).clearDiskCache();
}
}).start();
}else{
Glide.get(context).clearDiskCache();
}
} catch (Exception e){
e.printStackTrace();
}
}
/**
* 清除图片内存缓存
*/
public void clearImageMemoryCache(final Context context){
try{
if(Looper.myLooper() == Looper.getMainLooper()){
Glide.get(context).clearMemory();
}
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 删除指定目录下的文件,这里用于缓存的删除
*
* @param filePath filePath
* @param deleteThisPath deleteThisPath
*/
private void deleteFolderFile(String filePath, boolean deleteThisPath) {
if (!TextUtils.isEmpty(filePath)) {
try {
File file = new File(filePath);
if (file.isDirectory()) {
File files[] = file.listFiles();
for (File file1 : files) {
deleteFolderFile(file1.getAbsolutePath(), true);
}
}
if (deleteThisPath) {
if (!file.isDirectory()) {
file.delete();
} else {
if (file.listFiles().length == 0) {
file.delete();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 清除图片所有缓存
* 主要调用这个方法
*/
public void clearImageAllCache(Context context) {
clearImageDiskCache(context);
clearImageMemoryCache(context);
String ImageExternalCatchDir=context.getExternalCacheDir()+ ExternalCacheDiskCacheFactory.DEFAULT_DISK_CACHE_DIR;
deleteFolderFile(ImageExternalCatchDir, true);
}
}
清理缓存的按钮实现clearImageAllCache(Context context)方法就好了。
好好学习,天天向上。<( ̄oo, ̄)/