现在很多APP中都有系统设置,这个模块中有一个缓存设置功能,用户可以查看当前APP缓存数据大小并且可以手动清空缓存数据。
缓存数据的统计分2块:内存(这里指的是应用程序包目录所在位置)+外存(外部存储卡)
我这里以开源中国APP数据缓存处理为例为大家讲解下
清除的目录包括:
1./data/data/package_name/files
2./data/data/package_name/cache
3.<sdcard>/Android/data/<package_name>/cache/
4.webview缓存数据
[plain] view plain copy print ?
- // 计算缓存大小
- long fileSize = 0;
- String cacheSize = "0KB";
- File filesDir = getFilesDir();// /data/data/package_name/files
- File cacheDir = getCacheDir();// /data/data/package_name/cache
- fileSize += getDirSize(filesDir);
- fileSize += getDirSize(cacheDir);
- // 2.2版本才有将应用缓存转移到sd卡的功能
- if(isMethodsCompat(android.os.Build.VERSION_CODES.FROYO)){
- File externalCacheDir = getExternalCacheDir(this);//"<sdcard>/Android/data/<package_name>/cache/"
- fileSize += getDirSize(externalCacheDir);
- }
- if (fileSize > 0)
- cacheSize = formatFileSize(fileSize);
- public static 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;
- }
- public static boolean isMethodsCompat(int VersionCode) {
- int currentVersion = android.os.Build.VERSION.SDK_INT;
- return currentVersion >= VersionCode;
- }
- @TargetApi(8)
- public static File getExternalCacheDir(Context context) {
- // return context.getExternalCacheDir(); API level 8
- // e.g. "<sdcard>/Android/data/<package_name>/cache/"
- return context.getExternalCacheDir();
- }
- public static String formatFileSize(long fileS) {
- java.text.DecimalFormat df = new java.text.DecimalFormat("#.00");
- String fileSizeString = "";
- if (fileS < 1024) {
- fileSizeString = df.format((double) fileS) + "B";
- } else if (fileS < 1048576) {
- fileSizeString = df.format((double) fileS / 1024) + "KB";
- } else if (fileS < 1073741824) {
- fileSizeString = df.format((double) fileS / 1048576) + "MB";
- } else {
- fileSizeString = df.format((double) fileS / 1073741824) + "G";
- }
- return fileSizeString;
- }
- public static void clearAppCache(Activity activity) {
- final AppContext ac = (AppContext) activity.getApplication();
- final Handler handler = new Handler() {
- public void handleMessage(Message msg) {
- if (msg.what == 1) {
- ToastMessage(ac, "缓存清除成功");
- } else {
- ToastMessage(ac, "缓存清除失败");
- }
- }
- };
- new Thread() {
- public void run() {
- Message msg = new Message();
- try {
- ac.clearAppCache();
- msg.what = 1;
- } catch (Exception e) {
- e.printStackTrace();
- msg.what = -1;
- }
- handler.sendMessage(msg);
- }
- }.start();
- }
- 在项目中经常会使用到WebView 控件,当加载html 页面时,会在/data/data/package_name目录下生成database与cache 两个文件夹。请求的url 记录是保存在WebViewCache.db,而url 的内容是保存在WebViewCache 文件夹下
- public void clearAppCache()
- {
- //清除webview缓存
- @SuppressWarnings("deprecation")
- File file = CacheManager.getCacheFileBaseDir();
- //先删除WebViewCache目录下的文件
- if (file != null && file.exists() && file.isDirectory()) {
- for (File item : file.listFiles()) {
- item.delete();
- }
- file.delete();
- }
- deleteDatabase("webview.db");
- deleteDatabase("webview.db-shm");
- deleteDatabase("webview.db-wal");
- deleteDatabase("webviewCache.db");
- deleteDatabase("webviewCache.db-shm");
- deleteDatabase("webviewCache.db-wal");
- //清除数据缓存
- clearCacheFolder(getFilesDir(),System.currentTimeMillis());
- clearCacheFolder(getCacheDir(),System.currentTimeMillis());
- //2.2版本才有将应用缓存转移到sd卡的功能
- if(isMethodsCompat(android.os.Build.VERSION_CODES.FROYO)){
- clearCacheFolder(getExternalCacheDir(this),System.currentTimeMillis());
- }
- }
- 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();
- }
- }
- return deletedFiles;
- }