为 App 增加清理缓存功能
不废话,直接上干货
功能预期
- 评估缓存情况,估算出缓存大小;
- 一键清除所有缓存
评估缓存大小
已知 app 的缓存目录可通过 context.getCacheDir()
获取,那么评估其内容文件的大小即可,若有其他缓存路径也可通过此方法合并计算:
ini
public long getFolderSize(File folder) {
long length = 0;
File[] files = folder.listFiles();
if (files != null) {
for (File file : files) {
if (file.isFile()) {
length += file.length();
} else {
length += getFolderSize(file);
}
}
}
return length;
}
执行方法:
scss
// 新建异步线程防止卡顿
new Thread() {
@Override
public void run() {
super.run();
long cacheSize = getFolderSize(getCacheDir());
}
}.start();
接下来需要将缓存大小按照合理的格式显示到界面上,我按照自己的需求小于 1MB 时显示 KB 单位,小于 1KB 时显示 0 KB,使用以下方法即可完成缓存大小的文本组织:
arduino
public String formatSize(long size) {
if (size >= 1024 * 1024) {
return (size / (1024 * 1024)) + " MB";
} else if (size >= 1024) {
return (size / 1024) + " KB";
} else {
return "0 KB";
}
}
清理各单位缓存
WebView 的缓存清理
对于 WebView 可以直接使用 webView.clearCache(true)
方法来进行清理,但清除缓存的界面没有 WebView 实例,因此需要现场先建立一个来执行,注意 WebView 的创建不可以在异步线程进行:
ini
WebView webView = new WebView(me);
webView.clearCache(true);
Glide 的缓存清理
只需要注意 Glide 的缓存清理必须在异步线程执行
scss
try {
// Glide: You must call this method on a background thread
Glide.get(me).clearDiskCache();
} catch (Exception e) {
e.printStackTrace();
}
其他组件请自行按照对应技术文档进行清理
综合缓存文件清理
所有缓存文件删除即可彻底完成清理步骤
ini
File cacheDir = context.getCacheDir();
deleteDirectory(cacheDir);
删除目录方法:
scss
private static void deleteDirectory(File dir) {
if (dir != null && dir.isDirectory()) {
for (File child : dir.listFiles()) {
// 递归删除目录中的内容
deleteDirectory(child);
}
}
if (dir != null) {
dir.delete();
}
}
总结
其实清理缓存是个挺没必要的工作,Glide 等组件进行缓存的主要目的也在于避免重复资源的加载加快 app 的界面呈现速度,但不可避免的可能因为用户需要或者出现缓存 bug 导致界面无法正常显示等情况需要清理 app 缓存,即便系统本身自带了缓存清理功能(应用设置- app - 存储和缓存 - 清除缓存)但毕竟有些上手门槛且各家厂商操作系统操作逻辑各异不如自己做一个清除功能在 app 内了,通过上述代码即可完成缓存大小估算和清理流程,如有其他常用组件的清理操作方法也欢迎在评论区补充。