【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();
         }
     }
 }

            

發佈了52 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章