美文网首页Android Demoandroid
Android 清除缓存详细实现(显示缓存大小)

Android 清除缓存详细实现(显示缓存大小)

作者: 0156770c53ab | 来源:发表于2017-01-06 12:28 被阅读6983次

    清除缓存功能算是个十分鸡肋的功能了,但是大多数产品或者客户都希望有这么个东西显得APP功能完善,网上有很多,但是对于新手来说,那些感觉并不详细,我贴个完整到小白都能懂的。

    下面是工具类,包含清除缓存、获取缓存文件大小、格式化方法。

    总之就是工具,自己创建一个帖进去。

    public class CacheDataManager {

    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);

    }

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

    }

    // 获取文件

    // Context.getExternalFilesDir() --> SDCard/Android/data/你的应用的包名/files/

    // 目录,一般放一些长时间保存的数据

    // Context.getExternalCacheDir() -->

    // SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据

    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(double size) {

    double kiloByte = size / 1024;

    if (kiloByte < 1) {

    return size + "Byte";

    }

    double megaByte = kiloByte / 1024;

    if (megaByte < 1) {

    BigDecimal result1 = new BigDecimal(Double.toString(kiloByte));

    return result1.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "KB";

    }

    double gigaByte = megaByte / 1024;

    if (gigaByte < 1) {

    BigDecimal result2 = new BigDecimal(Double.toString(megaByte));

    return result2.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "MB";

    }

    double teraBytes = gigaByte / 1024;

    if (teraBytes < 1) {

    BigDecimal result3 = new BigDecimal(Double.toString(gigaByte));

    return result3.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "GB";

    }

    BigDecimal result4 = new BigDecimal(teraBytes);

    return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "TB";

    }

    }

    在你要显示的TextView上显示清理前的缓存大小,在Activity的onCreate()方法中直接设置就好了,其实就是调用了上面工具类的getTotalCacheSize()方法,有异常,需要捕获。

    try {

    txtCacheSize.setText(CacheDataManager.getTotalCacheSize(this));

    } catch (Exception e) {

    e.printStackTrace();

    }

    再创建一个内部类,用于清理内存,实现了一个Runnable,清理完后发一个消息,这里可以灵活一点。

    class clearCache implements Runnable {

    @Override

    public void run() {

    try {

    CacheDataManager.clearAllCache(SettingsActivity.this);

    Thread.sleep(3000);

    if (CacheDataManager.getTotalCacheSize(SettingsActivity.this).startsWith("0")) {

    handler.sendEmptyMessage(0);

    }

    } catch (Exception e) {

    return;

    }

    }

    }

    创建一个Handle接收消息,处理结果,其实用意是清理完了就弹一个吐司,清理完成,就是这样,也可以创建一个dialog,开始清理的时候显示,在下面方法关闭,然后再设置一遍TextView,就是下面这样。

    private Handler handler = new Handler() {

    public void handleMessage(android.os.Message msg) {

    switch (msg.what) {

    case 0:

    Toast.makeText(SettingActivity.this,"清理完成",Toast.LENGTH_SHORT).show();

    try {

    txtCacheSize.setText(CacheDataManager.getTotalCacheSize(SettingsActivity.this));

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    };

    };

    最后就是在设置监听的按钮中调用就好了。

    newThread(newclearCache()).start();

    相关文章

      网友评论

      • skl351:楼主这文章太棒啦,必须点赞
      • 墨池又雨:真的太棒 感谢感谢 从来没刻意登录上来 这次必须来点赞
      • 啟风了:感谢
      • 4839068c3f32:我在获取不到自己的缓存 写了个节操视频 播放好几遍没有视频 有加了个加载网络图片还是0没有任何变化 求解
        0156770c53ab:@李媛荣的一条狗 你去看看节操视频有没有相关的清除缓存的api,我也没看懂你说的什么,不过清除缓存这个功能本身很鸡肋
      • wayne777: 当SD卡存在或者SD卡不可被移除的时候,就调用getExternalCacheDir()方法来获取缓存路径,
        否则就调用getCacheDir()方法来获取缓存路径。
        0156770c53ab:@何思超 这个方法只能清除部分缓存,像图片这种是清不了的,因为是鸡肋功能,能有效果就好了
        66557b294560:我在设置获取的应用缓存是44kb 但是在应用内清除的时候只有5kb 请问如何解决:relaxed:
        0156770c53ab: @WeiYang_02c8 多谢!

      本文标题:Android 清除缓存详细实现(显示缓存大小)

      本文链接:https://www.haomeiwen.com/subject/ingkdttx.html