Android缓存一键清理功能,首先我们要知道缓存在哪里。
- 默认的缓存路径/cache
- webview的缓存
- glide、okHttp等三方依赖的缓存
- 自定义的缓存路径
1、默认的缓存路径
虽然我也不知道这里的缓存哪里来的。。。
getFilesDir() 对应存储位置:data/data/packagename/filesgetCacheDir() 对应存储位置:data/data/packagename/cache getExternalFilesDir() 对应存储位置:SDCard/Android/data/packagename/filesgetExternalCacheDir() 对应存储位置:SDCard/Android/data/packagename/cache复制代码
2、webview的缓存
webView缓存模式
1、LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据 2、LOAD_DEFAULT: 根据cache-control决定是否从网络上取数据。 3、LOAD_NO_CACHE: 不使用缓存,只从网络获取数据. 4、LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。复制代码
设置WebView 缓存模式
//设置缓存模式 mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT); String cacheDirPath = "/data/data/package_name/cache/webviewCache"; //设置数据库缓存路径 mWebView.getSettings().setDatabasePath(cacheDirPath); //设置 应用 缓存目录 mWebView.getSettings().setAppCachePath(cacheDirPath); //开启 DOM 存储功能 mWebView.getSettings().setDomStorageEnabled(true); //开启 数据库 存储功能 mWebView.getSettings().setDatabaseEnabled(true); //开启 应用缓存 功能 mWebView.getSettings().setAppCacheEnabled(true);复制代码
//清除webView缓存
3、glide/okHttp等三方缓存
大部分的三方依赖的可以设置缓存路径和缓存方式
比如说
Glide.get(this).clearMemory();清理内存中的缓存。Glide.get(this).clearDiskCache();清理硬盘中的缓存。复制代码
4、自定义的缓存
自行脑补
5、缓存工具类
自行定制修改
/** * 清除缓存 */public class CleanMessageUtil { /** * @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); } /** * @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(); int size = 0; if (children != null) { size = children.length; for (int i = 0; i < size; i++) { boolean success = deleteDir(new File(dir, children[i])); if (!success) { return false; } } } } if (dir == null) { return true; } else { return dir.delete(); } } //获取文件大小 public static long getFolderSize(File file) throws Exception { long size = 0; try { File[] fileList = file.listFiles(); int size2 = 0; if (fileList != null) { size2 = fileList.length; for (int i = 0; i < size2; 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 * @return */ public static String getFormatSize(double size) { double kiloByte = size / 1024; if (kiloByte < 1) { // return size + "Byte"; return "0K"; } 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"; }}复制代码