为 App 增加清理缓存功能

为 App 增加清理缓存功能

不废话,直接上干货

功能预期

  1. 评估缓存情况,估算出缓存大小;
  2. 一键清除所有缓存

评估缓存大小

已知 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 内了,通过上述代码即可完成缓存大小估算和清理流程,如有其他常用组件的清理操作方法也欢迎在评论区补充。

相关推荐
用户1305180712151 小时前
JDBC学习DAY2:从Statement到PreparedStatement
java
蛋蛋的就会顺顺的1 小时前
hot100——矩阵
java·数据结构·算法·leetcode·力扣
周杰偷奶茶2 小时前
【Java】数组的定义和使用(附管理系统实战案例)
java·开发语言
橙子圆1232 小时前
JUC之集合类不安全
java·开发语言
LCD液晶屏2 小时前
京瓷液晶屏停产替代:杭州立煌科技工业 LCD 解决方案
android·科技
谢亮_vipxieliang3 小时前
Stream API 不是银弹:常见坑与性能建议
java·开发语言
源码宝3 小时前
Web‑PACS 云影像源码|Java+Vue3 医院影像管理系统完整方案
java·源码·影像pacs·成品源码·医院影像系统
ShineWinsu3 小时前
对于Redis:string类型的解析
java·c++·redis·分布式·缓存·面试·string
2501_932750264 小时前
Android 自定义 View 入门
android
三8445 小时前
Fastjson 漏洞 · 02 · autoType 机制与 checkAutoType
java·fastjson