【GT-安卓应用开发之清理缓存】

前言:正文开始之前我们先熟悉一下两个概念:清理缓存与清理数据,所谓缓存我们可以将其看作一个临时存储,比如下载图片时生成的缓存文件;而数据则指的是用户的一些配置数据,比如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();
         }
     }
 }

            

猜你喜欢

转载自blog.csdn.net/qq_17433217/article/details/81074878