Android--實(shí)現(xiàn)清理緩存功能

有時候項(xiàng)目中需要清理一些緩存數(shù)據(jù)(如:圖片緩存爬泥、網(wǎng)絡(luò)數(shù)據(jù)緩存等),當(dāng)然也要對SharedPreferences存儲的數(shù)據(jù)進(jìn)行清理崩瓤,當(dāng)然App中有個這樣的功能可能會提高逼格吧袍啡。

實(shí)現(xiàn)效果:

image

該效果是根據(jù)之前demo基礎(chǔ)上實(shí)現(xiàn)的,所以上面部分的作用主要是為了產(chǎn)生緩存却桶,方便看到清除的效果境输。

這篇內(nèi)容主要包括獲取緩存的大小和對獲取的緩存進(jìn)行清除:

1.獲取緩存的大小

     /**
     * 獲取整體緩存大小
     * @param context
     * @return
     * @throws Exception
     */
    public static String getTotalCacheSize(Context context) throws Exception {
        long cacheSize = getFolderSize(context.getCacheDir());
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            cacheSize += getFolderSize(context.getExternalCacheDir());
        }
        return getFormatSize(cacheSize);
    }

2.獲取文件

     /**
     * 獲取文件
     * Context.getExternalFilesDir() --> SDCard/Android/data/你的應(yīng)用的包名/files/ 目錄,一般放一些長時間保存的數(shù)據(jù)
     * Context.getExternalCacheDir() --> SDCard/Android/data/你的應(yīng)用包名/cache/目錄颖系,一般存放臨時緩存數(shù)據(jù)
     * @param file
     * @return
     * @throws Exception
     */
    public static long getFolderSize(File file) throws Exception {
        long size = 0;
        try {
            File[] fileList = file.listFiles();
            for (int i = 0; i < fileList.length; i++) {
                // 如果下面還有文件
                if (fileList[i].isDirectory()) {
                    size = size + getFolderSize(fileList[i]);
                } else {
                    size = size + fileList[i].length();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return size;
    }

3.格式化單位

     /**
     * 格式化單位
     * @param size
     */
    public static String getFormatSize(long size) {
        long kb = size / 1024;
        int m = (int) (kb / 1024);
        int kbs = (int) (kb % 1024);
        return m + "." + kbs + "M";
    }

4.清除緩存

     /**
     * 清空方法
     * @param context
     */
    public static void clearAllCache(Context context) {
        deleteDir(context.getCacheDir());
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            deleteDir(context.getExternalCacheDir());
        }
    }

    private static boolean deleteDir(File dir) {
        if (dir != null && dir.isDirectory()) {
            String[] children = dir.list();
            for (int i = 0; i < children.length; i++) {
                boolean success = deleteDir(new File(dir, children[i]));
                if (!success) {
                    return false;
                }
            }
        }
        return dir.delete();
    }

為了方便嗅剖,將清除緩存的相關(guān)方法抽取成工具類,可以直接調(diào)取使用嘁扼,完整的工具類如下:
public class CacheDataManager {
    /**
     * 獲取整體緩存大小
     * @param context
     * @return
     * @throws Exception
     */
    public static String getTotalCacheSize(Context context) throws Exception {
        long cacheSize = getFolderSize(context.getCacheDir());
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            cacheSize += getFolderSize(context.getExternalCacheDir());
        }
        return getFormatSize(cacheSize);
    }

    /**
     * 獲取文件
     * Context.getExternalFilesDir() --> SDCard/Android/data/你的應(yīng)用的包名/files/ 目錄信粮,一般放一些長時間保存的數(shù)據(jù)
     * Context.getExternalCacheDir() --> SDCard/Android/data/你的應(yīng)用包名/cache/目錄,一般存放臨時緩存數(shù)據(jù)
     * @param file
     * @return
     * @throws Exception
     */
    public static long getFolderSize(File file) throws Exception {
        long size = 0;
        try {
            File[] fileList = file.listFiles();
            for (int i = 0; i < fileList.length; i++) {
                // 如果下面還有文件
                if (fileList[i].isDirectory()) {
                    size = size + getFolderSize(fileList[i]);
                } else {
                    size = size + fileList[i].length();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return size;
    }

    /**
     * 格式化單位
     * @param size
     */
    public static String getFormatSize(long size) {
        long kb = size / 1024;
        int m = (int) (kb / 1024);
        int kbs = (int) (kb % 1024);
        return m + "." + kbs + "M";
    }

    /**
     * 清空方法
     * @param context
     */
    public static void clearAllCache(Context context) {
        deleteDir(context.getCacheDir());
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            deleteDir(context.getExternalCacheDir());
        }
    }

    private static boolean deleteDir(File dir) {
        if (dir != null && dir.isDirectory()) {
            String[] children = dir.list();
            for (int i = 0; i < children.length; i++) {
                boolean success = deleteDir(new File(dir, children[i]));
                if (!success) {
                    return false;
                }
            }
        }
        return dir.delete();
    }
}

工具類的使用:

  • 獲取緩存總量
String cacheAllSize = CacheDataManager.getTotalCacheSize(this)

  • 清除緩存
 CacheDataManager.clearAllCache(this);

以上代碼經(jīng)過本人測試暫時沒有問題 ,如果發(fā)現(xiàn)不能用的問題請及時反饋

作者:i小灰
鏈接:http://www.reibang.com/p/25d591b87a0a/
來源:簡書
簡書著作權(quán)歸作者所有趁啸,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處强缘。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市不傅,隨后出現(xiàn)的幾起案子旅掂,更是在濱河造成了極大的恐慌,老刑警劉巖访娶,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件商虐,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)秘车,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門典勇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鲫尊,你說我怎么就攤上這事痴柔。” “怎么了疫向?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長豪嚎。 經(jīng)常有香客問我搔驼,道長,這世上最難降的妖魔是什么侈询? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任舌涨,我火速辦了婚禮,結(jié)果婚禮上扔字,老公的妹妹穿的比我還像新娘囊嘉。我一直安慰自己,他們只是感情好革为,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布扭粱。 她就那樣靜靜地躺著,像睡著了一般震檩。 火紅的嫁衣襯著肌膚如雪琢蛤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天抛虏,我揣著相機(jī)與錄音博其,去河邊找鬼。 笑死迂猴,一個胖子當(dāng)著我的面吹牛慕淡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沸毁,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼峰髓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了以清?” 一聲冷哼從身側(cè)響起儿普,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掷倔,沒想到半個月后眉孩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年浪汪,在試婚紗的時候發(fā)現(xiàn)自己被綠了巴柿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡死遭,死狀恐怖广恢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呀潭,我是刑警寧澤钉迷,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站钠署,受9級特大地震影響糠聪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谐鼎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一舰蟆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狸棍,春花似錦身害、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至猾瘸,卻和暖如春界赔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背牵触。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工淮悼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人揽思。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓袜腥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親钉汗。 傳聞我的和親對象是個殘疾皇子羹令,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容