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

相关推荐
折哥的程序人生 · 物流技术专研2 小时前
第4篇:Lambda 简化策略模式(Java 8+)
java·设计模式·策略模式·函数式编程·lambda·代码简化·扩充系列
私人珍藏库2 小时前
[Android] PeakFinder AR v4.8.89 (山峰全景识别+增强现实山峰查看器)
android·人工智能·智能手机·ar·工具·软件
researcher-Jiang2 小时前
高性能计算之OpenMP——超算习堂学习1
android·java·学习
alexhilton3 小时前
Kotlin DSL深度解析:从Gradle脚本到构建你自己的DSL
android·kotlin·android jetpack
烽火聊员3 小时前
查看Android Studio错误日志
android·ide·android studio
西门吹-禅4 小时前
java springboot N+1问题
java·开发语言·spring boot
DLYSB_4 小时前
生命通道:如何用 HIS 医疗系统直连网络声光终端,打造“零延误”的危急值响应网关?
java·网络·数据库·报警灯
weixin_BYSJ19874 小时前
SpringBoot + MySQL 乒乓球运动员信息管理系统项目实战--附源码04954
java·javascript·spring boot·python·django·flask·php
AI小码4 小时前
LLM 应用的缓存工程:当每次 API 调用都在燃烧成本
java·人工智能·spring·计算机·llm·编程·api
Hui Baby5 小时前
Spring Security
java·后端·spring