android实现清理缓存功能

android之清理缓存实现,供大家参考,具体内容如下

一. 清理缓存首先要搞清楚清理哪些东西

1、app本身的功能比如录像,录音,更新都会产生文件,需要清理
2、app的默认缓存地址cache

二. 搞清楚要清理的文件夹位置

1、首先app自身的功能就要看自己把它放在了什么位置
2、默认缓存地址:getActivity().getExternalCacheDir();
这个位置是在storage/emulated/0/Android/data/com.xxxxxapp/cache

三.代码功能模块:

1、获取app缓存大小,以字节为单位
2、获取某个文件夹的大小,以字节为单位
3、把字节单位换算成常用单位
4、把缓存大小设置到页面,清理前一次,清理后一次
5、删除文件夹功能
6、清除app缓存

/**
 * 获取app的缓存大小
 * 1. 录制的视频/storage/emulated/0/xueliangapp/video/1573972925136.mp4
 * 2. 录制的音频/storage/emulated/0/xueliangapp/radio/1573972925136.amr
 * 3. 下载的更新包/storage/emulated/0/Android/data/com.sdxzt.xueliangapp_v3/files/Download/xueliang_update.apk
 * 4. 缓存/storage/emulated/0/Android/data/com.sdxzt.xueliangapp_v3/cache
*/
  File videoDir,radioDir,filesDir,cacheDir;
  private String getAppCache(){
    long fileSize = 0;
    String cacheSize = "0KB";
    videoDir = new File(Environment.getExternalStorageDirectory()+"/xueliangapp/video");
    Log.d(TAG, "getAppCache: videoDir大小: "+getDirSize(videoDir));
    radioDir = new File(Environment.getExternalStorageDirectory()+"/xueliangapp/radio");
    Log.d(TAG, "getAppCache: radioDir大小: "+getDirSize(radioDir));
    filesDir = getActivity().getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
    Log.d(TAG, "getAppCache: filesDir大小: "+getDirSize(filesDir));
    ///storage/emulated/0/Android/data/com.sdxzt.xueliangapp_v3/files,这里面有download文件夹,里面是下载的更新包
    cacheDir = getActivity().getExternalCacheDir();
    Log.d(TAG, "getAppCache: cacheDir大小: "+getDirSize(cacheDir));
    ///storage/emulated/0/Android/data/com.sdxzt.xueliangapp_v3/cache
    fileSize += getDirSize(getActivity().getFilesDir());
    fileSize += getDirSize(getActivity().getCacheDir());//这行是默认的缓存地址,看图片什么的会在这里积累缓存
    fileSize += getDirSize(videoDir);
    fileSize += getDirSize(radioDir);
    fileSize += getDirSize(filesDir);
    fileSize += getDirSize(cacheDir);
    String fileSizeStr = formatFileSize(fileSize);
    Log.d(TAG, "getAppCache: 总缓存大小: "+fileSizeStr);
    return fileSizeStr;
  }

  /**
   * 获取文件大小(字节为单位)
   * @param dir
   * @return
   */
  private long getDirSize(File dir) {
    if (dir == null) {
      return 0;
    }
    if (!dir.isDirectory()) {
      return 0;
    }
    long dirSize = 0;
    File[] files = dir.listFiles();
    for (File file : files) {
      if (file.isFile()) {
        dirSize += file.length();//文件的长度就是文件的大小
      } else if (file.isDirectory()) {
        dirSize += file.length();
        dirSize += getDirSize(file); // 递归调用继续统计
      }
    }
    return dirSize;
  }

  /**
   * 格式化文件长度
   * @param fileSize
   * @return
   */
  private String formatFileSize(long fileSize){
    DecimalFormat df = new DecimalFormat("#0.00");//表示小数点前至少一位,0也会显示,后保留两位

    String fileSizeString = "";
    if (fileSize < 1024) {
      fileSizeString = df.format((double) fileSize) + "B";
    } else if (fileSize < 1048576) {
      fileSizeString = df.format((double) fileSize / 1024) + "KB";
    } else if (fileSize < 1073741824) {
      fileSizeString = df.format((double) fileSize / 1048576) + "MB";
    } else {
      fileSizeString = df.format((double) fileSize / 1073741824) + "G";
    }
    return fileSizeString;
  }
  private void setAppCache() {
    String fileSize = getAppCache();
    fileSizeTv.setText(fileSize);
    Log.d(TAG, "setAppCache: 重新显示缓存大小");
    Log.d(TAG, "setAppCache: 当前缓存"+fileSize);
  }

  public void clearAppCache(final Activity activity){

    final Handler handler = new Handler(){
      @Override
      public void handleMessage(@NonNull Message msg) {
        super.handleMessage(msg);
        Log.d(TAG, "handlerMessage: ");
        if (msg.what == 1) {
          setAppCache();
          Log.d(TAG, "handlerMessage: 缓存清除完毕");
          ToastUtil.showMsg(getActivity(),"缓存清除完毕");
        }else {
          ToastUtil.showMsg(getActivity(),"缓存清除失败");
          Log.d(TAG, "handlerMessage: 缓存清除失败");
        }
      }
    };

    new Thread(new Runnable() {
      @Override
      public void run() {
        Log.d(TAG, "run: ");
        Message msg = new Message();
        try {
          clearCacheFolder(videoDir,System.currentTimeMillis());
          clearCacheFolder(radioDir,System.currentTimeMillis());
          clearCacheFolder(filesDir,System.currentTimeMillis());
          clearCacheFolder(cacheDir,System.currentTimeMillis());
          msg.what = 1;
        }catch (Exception e){
          e.printStackTrace();
          msg.what = -1;
        }
        handler.sendMessage(msg);
      }
    }).start();
  }

  /**
   * 清除缓存目录
   * @param dir 目录
   * @param curTime 当前系统时间
   */
  private int clearCacheFolder(File dir,long curTime){
    int deletedFiles = 0;
    if (dir!= null && dir.isDirectory()) {
      try {
        for (File child:dir.listFiles()) {
          if (child.isDirectory()) {
            deletedFiles += clearCacheFolder(child, curTime);
          }
          if (child.lastModified() < curTime) {
            if (child.delete()) {
              deletedFiles++;
            }
          }
        }
      } catch(Exception e) {
        e.printStackTrace();
      }
    }
    Log.d(TAG, "clearCacheFolder: 清除目录: "+dir.getAbsolutePath());
    return deletedFiles;
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2019-11-20

Android 8.0的缓存大小和缓存清理接口方法

获取缓存大小接口 主要这里的方法已经和7.0不兼容了. import android.app.usage.UsageStats; import android.app.usage.UsageStatsManager; import android.content.Context; import android.content.pm.PackageManager; import android.os.Process; import android.os.storage.StorageManager

Android 7.0系统webview 显示https页面空白处理方法

最近开发的时候,偶尔遇到在线上稳定运行的webview内嵌的h5页面加载不出来,一直定位不到具体原因(因为我们自己做的兼容性测试上不重现),看系统日志也没有发现什么问题,后来咨询了用户手机的型号,发现是7.0或者6.0以上的个别机型会出现. 后来借到了一台业务的手机,型号是:三星 S6 EDGE,SM-G9205,在大多数机型上运行正常的页面,在这个机器上如下图: 这个页面在近期的变更是从http切换到https,由于之前的页面是http,我们在切换的时候,除了url之外,并未对webview的

Android 5.0及以上编程实现屏幕截图功能的方法

本文实例讲述了Android 5.0及以上编程实现屏幕截图功能的方法.分享给大家供大家参考,具体如下: 在Android 5.0,API 21 之前想要截图系统屏幕必须Root才能完成,5.0之后开放了接口,下面看我们是怎么实现的. 一. 涉及到的相关类 1. MediaProjectionManager 官方原话: Manages the retrieval of certain types of {@link MediaProjection} tokens. 这个类通过 Context#ge

Android Studio3.0升级后使用注意事项及解决方法

Gradle plugin最高版本4.* 老的项目在使用新版本时,可能会出现gradle plugin冲突的问题 Error:Failed to open zip file. Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.) Re-download dependencies and sync project (requires network)

Android 8.0版本更新无法自动安装问题的解决方法

前言 前几天APP上线了个新版本,有部分用户反应在下载完安装包以后点击安装无反应.查了下这部分用户手机的系统的版本都是8.0+版本.因为太久没关注新版本特性,所以导致了这个问题的发生. Android 8.0 (Android O)为了针对一些流氓软件引导用户安装其他无关应用.在应用权限设置的"特殊访问权限"中,加入了"安装其他应用"的设置. 实现 1.清单文件权限声明 <uses-permissionandroid:name="android.pe

Android 8.0中一些坑以及对应的解决方法

前言 虽然 Android 9.0 都已经面世了,本篇文章写的有点迟了. 但是迟到好过不到,因此基于此这边还是记录一下项目中遇到的 Android 8.0 的坑及对应解决方法. 每次系统升级,虽然系统功能更加强大了,各方面性能也提高了. 但是对于开发者而言,一个困扰的问题也是随之而来--兼容. 尤其对于一些已经上市的 App 而言,在新系统发布之前就要了解到底有哪些改动,以避免用户升级新系统后导致 App 没法正常运行. 好了,回归主题,说说 Android 8.0 里面的几个坑吧. 唤不起系统

Android 8.0不能自动安装APK问题的解决方法(完美适配)

Android8.0之前 未知应用安装权限默认开启,如下图所示 8.0以下手机未知应用安装权限.png Android8.0之后 未知应用安装权限默认关闭,且权限入口隐藏. 如何开启未知应用安装权限的入口,并设置允许安装? 在清单文件中添加权限 <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/> 判断当前是否为8.0以上系统(在这之前也可以对7.0系统进行判断,这里代码没

Android 6.0指纹识别App开发案例

在android 6.0中google终于给android系统加上了指纹识别的支持,这个功能在iPhone上早就已经实现了,并且在很多厂商的定制的ROM中也都自己内部实现这个功能了,这个功能来的有点晚啊.在google全新发布的nexus设备:nexus 5x和nexus 6p中都携带了一颗指纹识别芯片在设备的背面,如下图(图片来自网络): 笔者手中的设备就是图上的那台黑色的nexus 5x,话说这台机器很是好看呢!手感超棒! 废话不多说,下面我出一个指纹识别的demo app,并且详细说明怎么

Android获取应用程序大小和缓存的实例代码

info package com.qin.appsize; import android.content.Intent; import android.graphics.drawable.Drawable; //Model类 ,用来存储应用程序信息 public class AppInfo { private String appLabel; //应用程序标签 private Drawable appIcon ; //应用程序图像 private Intent intent ; //启动应用程序

Android中Glide获取缓存大小并清除缓存图片

清除Glide缓存 Glide自带清除缓存的功能,分别对应Glide.get(context).clearDiskCache();(清除磁盘缓存)与Glide.get(context).clearMemory();(清除内存缓存)两个方法.其中clearDiskCache()方法必须运行在子线程,clearMemory()方法必须运行在主线程,这是这两个方法所强制要求的,详见源码. 获取Glide缓存空间大小 这个网上也有过一些介绍,但是给出的实现代码存在一些问题,我这里做了一定的修改.一下方法