前言:正文开始之前我们先熟悉一下两个概念:清理缓存与清理数据,所谓缓存我们可以将其看作一个临时存储,比如下载图片时生成的缓存文件;而数据则指的是用户的一些配置数据,比如SP与数据库或者一些其他配置文件。与存储类似的,在安卓中缓存也是分成内部缓存与外部缓存,所以在清除缓存的时候需要注意,以免清理不完全。
接下来,让我们来一起实现简单的清理缓存:
Step1,计算缓存大小
前面我们提到过缓存分为内部缓存与外部缓存,所以缓存大小=内部缓存大小+外部缓存大小
我们定义一个函数来计算某一个目录的大小,需要注意的是该目录下可能既有文件夹又有文件,在这里会用到递归,代码如下:
public long getCacheSize(File file) throws Exception { long size = 0; try { File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { // 如果下面还有文件 if (files[i].isDirectory()) { size = size + getCacheSize(files[i]); } else { size = size + files[i].length(); } } } catch (Exception e) { e.printStackTrace(); } return size; }
上面代码计算出来的大小是long类型的,我们需要将其转化为我们熟悉的格式,转化代码如下:
public String getFormatedSize(long file) { DecimalFormat df = new DecimalFormat("#.00"); String size = ""; String wrongSize="0B"; if(file==0){ return wrongSize; } if (file < 1024){ size = df.format((double) file) + "B"; } else if (file < 1048576){ size = df.format((double) file / 1024) + "KB"; } else if (file < 1073741824){ size = df.format((double) file / 1048576) + "MB"; } else{ size = df.format((double) file / 1073741824) + "GB"; } return size; }
Step2,清理提醒:
为避免用户误操作而导致数据的丢失,用户在选择清理缓存后一般都会弹出一个提醒框,由于代码较简单,这里就不贴出来了
Step3,开始清理:
同样的,清理缓存既要清理内部缓存又要清理外出缓存,代码如下:
public void doCacheClear(){ try { deleteFilesByDirectory(this.getCacheDir()); if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { deleteFilesByDirectory(this.getExternalCacheDir()); } Toast.makeText(this, "清理成功", Toast.LENGTH_SHORT).show(); }catch(Exception e){ Toast.makeText(this, "清理失败,请稍后重试", Toast.LENGTH_SHORT).show(); } } private static void deleteFilesByDirectory(File directory) { if (directory != null && directory.exists() && directory.isDirectory()) { for (File item : directory.listFiles()) { item.delete(); } } }