美文网首页Android开发学习Glide资料搜集
Glide获取缓存大小并清除缓存图片

Glide获取缓存大小并清除缓存图片

作者: Trojx | 来源:发表于2016-10-11 00:45 被阅读9241次

    清除Glide缓存

    Glide自带清除缓存的功能,分别对应Glide.get(context).clearDiskCache();(清除磁盘缓存)与Glide.get(context).clearMemory();(清除内存缓存)两个方法.其中clearDiskCache()方法必须运行在子线程,clearMemory()方法必须运行在主线程,这是这两个方法所强制要求的,详见源码.

    获取Glide缓存空间大小

    这个网上也有过一些介绍,但是给出的实现代码存在一些问题,我这里做了一定的修改.一下方法适合在Glide为默认的缓存目录的情况,不论是内部存储空间还是外部.因为我们可以通过InternalCacheDiskCacheFactory.DEFAULT_DISK_CACHE_DIRExternalCacheDiskCacheFactory.DEFAULT_DISK_CACHE_DIR获取到位于内部与外部存储的缓存文件夹的文件夹名,并通过context.getCacheDir()context.getExternalCacheDir()获取内部与外部存储的路径.进而可以通过遍历文件夹内的文件进行缓存文件大小求和与全部清除.以下工具类在其他的文章中有前辈写过,但是存在一些已知的问题,这里做了一些修改.

    import android.content.Context;
    import android.os.Looper;
    import android.text.TextUtils;
    
    import com.bumptech.glide.Glide;
    import com.bumptech.glide.load.engine.cache.ExternalCacheDiskCacheFactory;
    import com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory;
    
    import java.io.File;
    import java.math.BigDecimal;
    
    /**Glide缓存工具类
    * Created by Trojx on 2016/10/10 0010.
    */
    
    public class GlideCacheUtil {
    private static GlideCacheUtil inst;
    
    public static GlideCacheUtil getInstance() {
    if (inst == null) {
    inst = new GlideCacheUtil();
    }
    return inst;
    }
    
    /**
    * 清除图片磁盘缓存
    */
    public void clearImageDiskCache(Context context) {
    try {
    if (Looper.myLooper() == Looper.getMainLooper()) {
    new Thread(new Runnable() {
    @Override
    public void run() {
    Glide.get(context).clearDiskCache();
    // BusUtil.getBus().post(new GlideCacheClearSuccessEvent());
    }
    }).start();
    } else {
    Glide.get(context).clearDiskCache();
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    
    /**
    * 清除图片内存缓存
    */
    public void clearImageMemoryCache(Context context) {
    try {
    if (Looper.myLooper() == Looper.getMainLooper()) { //只能在主线程执行
    Glide.get(context).clearMemory();
    }
    } 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);
    }
    
    /**
    * 获取Glide造成的缓存大小
    *
    * @return CacheSize
    */
    public String getCacheSize(Context context) {
    try {
    return getFormatSize(getFolderSize(new File(context.getCacheDir() + "/"+InternalCacheDiskCacheFactory.DEFAULT_DISK_CACHE_DIR)));
    } catch (Exception e) {
    e.printStackTrace();
    }
    return "";
    }
    
    /**
    * 获取指定文件夹内所有文件大小的和
    *
    * @param file file
    * @return size
    * @throws Exception
    */
    private long getFolderSize(File file) throws Exception {
    long size = 0;
    try {
    File[] fileList = file.listFiles();
    for (File aFileList : fileList) {
    if (aFileList.isDirectory()) {
    size = size + getFolderSize(aFileList);
    } else {
    size = size + aFileList.length();
    }
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    return size;
    }
    
    /**
    * 删除指定目录下的文件,这里用于缓存的删除
    *
    * @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();
    }
    }
    }
    
    /**
    * 格式化单位
    *
    * @param size size
    * @return size
    */
    private static String getFormatSize(double size) {
    
    double kiloByte = size / 1024;
    if (kiloByte < 1) {
    return size + "Byte";
    }
    
    double megaByte = kiloByte / 1024;
    if (megaByte < 1) {
    BigDecimal result1 = new BigDecimal(Double.toString(kiloByte));
    return result1.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "KB";
    }
    
    double gigaByte = megaByte / 1024;
    if (gigaByte < 1) {
    BigDecimal result2 = new BigDecimal(Double.toString(megaByte));
    return result2.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "MB";
    }
    
    double teraBytes = gigaByte / 1024;
    if (teraBytes < 1) {
    BigDecimal result3 = new BigDecimal(Double.toString(gigaByte));
    return result3.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "GB";
    }
    BigDecimal result4 = new BigDecimal(teraBytes);
    
    return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "TB";
    }
    }
    
    通过它就能实现一个清除图片缓存的功能,在应用中实现的效果如下: http://cdn.trojx.me/blog_pic/glide_cache_clear_before.png http://cdn.trojx.me/blog_pic/glide_cache_clear_after.png

    相关文章

      网友评论

      • 王人冉:看着很不错,想使用下
      • 王人冉:博主,你这是什么应用?
      • N城渔夫:好东西,好东西哎
      • ChangQin:为什么我获取到的是0kb啊:sweat:
      • e7931506b063:刚好用到,感谢分享!!
      • 6e99bf7c0c86:你好,我用glide缓存的图片都显示在了图库里面,然后我用你的方法,指定了一个文件夹,然后调用GlideCatchUtil.getInstance().cleanCatchDisk()这个方法,删除,但是图片还在
      • 9bfc7878f5b3:感谢博主,解决了困扰很久的问题!
      • 我才是张雷:楼主您好,请问怎么调用您的工具类里的clearImageAllCache,怎么去监听成功失败和进度呢
        e7931506b063:自己在里面写个interface就行
        我才是张雷:@寂小楠 没有,我就调完方法后直接调吐司的
        933493d03874:我也想问,你知道怎么弄了吗?求分享
      • i冰点:楼主,你好,我在activity B中使用Glide加载了很多图片(也缓存在了内存中),在退出B的时候,怎么清除这部分图片的内存缓存?
        Trojx:@i冰点 抱歉这部分我也不是很了解.但据我所知,没有直接控制内存释放的API .内存管理的工作应该是Glide自行控制(类似Java的GC).如果一个图片资源不再被引用 那么将不久被释放.
        i冰点: 你好,还是不太明白。。。
        在B中,imageview在一个recycleview里,在B退出的时候,怎么释放这些图片占的内存?有没有类似的例子?
        Trojx:Glide.clear(<your_image_view>);
        取消加载所有正要加载进这个View的资源,并释放所有已加载至这个View的资源.
      • 0156770c53ab:楼主你好,请问getcachedir()得到的文件夹里面是缓存的什么文件?
        0156770c53ab:@Trojx 嗯嗯,知道了,非常感谢😃
        Trojx:这是Android的API 返回的是当前应用的缓存文件的根路径,你可以理解为一个专门存放缓存文件的文件夹,它的一般格式为 /data/data/<应用包名>/cache
      • Prettyxbb:好了,谢谢
      • Prettyxbb:楼主你好,为什么我清除之后,缓存没有变化呢? :cold_sweat:
      • 魔酷粉蓝:deleteFolderFile(ImageExternalCatchDir, true);这是清理什么的,前面两个Glide提供的方法不是清理缓存了吗?
      • 0b4a8a69f146:楼主,你好,你知道怎么清除特定URL的缓存吗?(比如用户头像,在更新了之后,需要reload,但是现在的策略是要么不能清,要么必须全部清除)
        0b4a8a69f146:@Trojx 非常感谢:stuck_out_tongue_closed_eyes:。回头我试下
        Trojx:你好,你说的情况应该是服务器图片url不变但是文件已经更新的情况,可以利用Signature特性,可以参看这篇文章:https://muzhi1991.gitbooks.io/android-glide-wiki/content/chapter1.html
        另外,针对头像的加载,还可以这样做: Glide.with(this).load("<you url>").diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true).into(<youview>); 不缓存头像图片文件,每次都请求最新的,这样也不用你判断服务端是否更新了.但我觉得最好的方式还是服务端url也要随之改变. :smiley:

      本文标题:Glide获取缓存大小并清除缓存图片

      本文链接:https://www.haomeiwen.com/subject/emivyttx.html