前言:正文開始之前我們先熟悉一下兩個概念:清理緩存與清理數據,所謂緩存我們可以將其看作一個臨時存儲,比如下載圖片時生成的緩存文件;而數據則指的是用戶的一些配置數據,比如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(); } } }