为 App 添加整理缓存功用

不废话,直接上干货

功用预期

  1. 评价缓存情况,预算出缓存巨细;
  2. 一键铲除所有缓存

评价缓存巨细

已知 app 的缓存目录可经过 context.getCacheDir() 获取,那么评价其内容文件的巨细即可,若有其他缓存路径也可经过此办法合并核算:

public long getFolderSize(File folder) {
  long length = 0;
  File[] files = folder.listFiles();
  
  if (files != null) {
    for (File file : files) {
      if (file.isFile()) {
        length += file.length();
       } else {
        length += getFolderSize(file);
       }
     }
   }
  return length;
}

履行办法:

// 新建异步线程防止卡顿
new Thread() {
  @Override
  public void run() {
    super.run();
        long cacheSize = getFolderSize(getCacheDir());
   }
}.start();

接下来需要将缓存巨细依照合理的格式显现到界面上,我依照自己的需求小于 1MB 时显现 KB 单位,小于 1KB 时显现 0 KB,运用以下办法即可完成缓存巨细的文本组织:

public String formatSize(long size) {
  if (size >= 1024 * 1024) {
    return (size / (1024 * 1024)) + " MB";
   } else if (size >= 1024) {
    return (size / 1024) + " KB";
   } else {
    return "0 KB";
   }
}

整理各单位缓存

WebView 的缓存整理

对于 WebView 可以直接运用 webView.clearCache(true) 办法来进行整理,但铲除缓存的界面没有 WebView 实例,因而需要现场先建立一个来履行,注意 WebView 的创建不可以在异步线程进行:

WebView webView = new WebView(me);
webView.clearCache(true);

Glide 的缓存整理

只需要注意 Glide 的缓存整理必须在异步线程履行

try {
  // Glide: You must call this method on a background thread
  Glide.get(me).clearDiskCache();
  } catch (Exception e) {
  e.printStackTrace();
}

其他组件请自行依照对应技能文档进行整理

归纳缓存文件整理

所有缓存文件删除即可彻底完成整理过程

File cacheDir = context.getCacheDir();
deleteDirectory(cacheDir);

删除目录办法:

private static void deleteDirectory(File dir) {
  if (dir != null && dir.isDirectory()) {
    for (File child : dir.listFiles()) {
      // 递归删除目录中的内容
      deleteDirectory(child);
     }
   }
  if (dir != null) {
    dir.delete();
   }
}

总结

其实整理缓存是个挺没必要的作业,Glide 等组件进行缓存的首要目的也在于防止重复资源的加载加快 app 的界面出现速度,但不可防止的可能由于用户需要或者出现缓存 bug 导致界面无法正常显现等情况需要整理 app 缓存,即便体系本身自带了缓存整理功用(使用设置- app – 存储和缓存 – 铲除缓存)但毕竟有些上手门槛且各家厂商操作体系操作逻辑各异不如自己做一个铲除功用在 app 内了,经过上述代码即可完成缓存巨细预算和整理流程,如有其他常用组件的整理操作办法也欢迎在谈论区弥补。