Android开发记录20-获取缓存大小和清除缓存功能

转载请注明:IT_xiao小巫 
博客地址:http://blog.csdn.net/wwj_748

前言

本篇博客要给大家分享的如何获取应用缓存的大小和清除缓存的功能,我们知道我们应用当中经常会产生一些数据,比如图片的缓存,数据库文件,配置文件等等。我们开发产品的时候,可能会有这样的一个需求清除应用内缓存的数据,可以让用户选择删除应用内产生的数据,这也是比较人性化的设计点。例如笔者参与开发的一款产品的设置界面就提供了清除缓存的功能,如下图所示:

在贴一大段代码之前,先普及Android的相关知识点:

先看360手机助手的一张图:

从上面这张图,我们可以看到这部手机有

系统文件(注:这个是系统的文件系统,不允许修改的)

内置SD卡(注:现在的手机基本上都有,就是我们所谓的ROM,是不可以移除的,RAM是我们手机的运行内存)

外置SD卡(注:这个就是我们的SD卡了,可以移除)

我们来考虑一个问题我们应用内的缓存数据存放在哪里?

我们的应用程序一般会产生以下几种类型的数据:

file-普通的文件存储

database-数据库文件(.db文件)

sharedPreference-配置数据(.xml文件)

cache-图片缓存文件

应用内数据的所有路径:

/data/data/com.xxx.xxx/cache - 应用内缓存(注:对应方法getCacheDir())

/data/data/com.xxx.xxx/databases - 应用内数据库

/data/data/com.xxx.xxx/shared_prefs - 应用内配置文件

/data/data/com.xxx.xxx/files - 应用内文件(注:对应方法getFilesDir())

一种情况,我们没有外置SD卡,那么我们安装的应用安装在哪里?自然是手机中的内置SD卡里,具体路径是这样的:

那在Android是用什么方法来获取这个路径的:

如果我们手机有外置SD卡,我们也可以把应用安装在SD卡,但移除SD卡之后就不能使用了。

不管是内置还是外置SD卡,获取路径的方法是一样:

获取SD卡根目录:Environment.getExternalStorageDirectory().getAbsolutePath();

外部Cache路径:/mnt/sdcard/android/data/com.xxx.xxx/cache 一般存储缓存数据(注:通过getExternalCacheDir()获取)

外部File路径:/mnt/sdcard/android/data/com.xxx.xxx/files 存储长时间存在的数据 (注:通过getExternalFilesDir(String type)获取, type为特定类型,可以是以下任何一种

Environment.DIRECTORY_MUSIC, Environment.DIRECTORY_PODCASTS, Environment.DIRECTORY_RINGTONES, Environment.DIRECTORY_ALARMS, Environment.DIRECTORY_NOTIFICATIONS, Environment.DIRECTORY_PICTURES, or Environment.DIRECTORY_MOVIES. )

最后提供一个工具类:

DataCleanManager.java

package com.infzm.daily.know.utils;/*  * 文 件 名:  DataCleanManager.java  * * 描    述:  主要功能有清除内/外缓存,清除数据库,清除sharedPreference,清除files和清除自定义目录  * */import java.io.File;
import java.math.BigDecimal;import android.content.Context;
import android.os.Environment;
import android.text.TextUtils;/** * 本应用数据清除管理器 */
public class DataCleanManager {/*** * 清除本应用内部缓存(/data/data/com.xxx.xxx/cache) * ** * @param context*/public static void cleanInternalCache(Context context) {deleteFilesByDirectory(context.getCacheDir());}/*** * 清除本应用所有数据库(/data/data/com.xxx.xxx/databases) * ** * @param context*/public static void cleanDatabases(Context context) {deleteFilesByDirectory(new File("/data/data/"+ context.getPackageName() + "/databases"));}/*** * 清除本应用SharedPreference(/data/data/com.xxx.xxx/shared_prefs) ** * @param context*/public static void cleanSharedPreference(Context context) {deleteFilesByDirectory(new File("/data/data/"+ context.getPackageName() + "/shared_prefs"));}/*** * 按名字清除本应用数据库 * ** * @param context* @param dbName*/public static void cleanDatabaseByName(Context context, String dbName) {context.deleteDatabase(dbName);}/*** * 清除/data/data/com.xxx.xxx/files下的内容 * ** * @param context*/public static void cleanFiles(Context context) {deleteFilesByDirectory(context.getFilesDir());}/*** * 清除外部cache下的内容(/mnt/sdcard/android/data/com.xxx.xxx/cache)* * @param context*/public static void cleanExternalCache(Context context) {if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {deleteFilesByDirectory(context.getExternalCacheDir());}}/*** * 清除自定义路径下的文件,使用需小心,请不要误删。而且只支持目录下的文件删除 * ** * @param filePath* */public static void cleanCustomCache(String filePath) {deleteFilesByDirectory(new File(filePath));}/*** * 清除本应用所有的数据 * ** * @param context* @param filepath*/public static void cleanApplicationData(Context context, String... filepath) {cleanInternalCache(context);cleanExternalCache(context);cleanDatabases(context);cleanSharedPreference(context);cleanFiles(context);if (filepath == null) {return;}for (String filePath : filepath) {cleanCustomCache(filePath);}}/*** * 删除方法 这里只会删除某个文件夹下的文件,如果传入的directory是个文件,将不做处理 * ** * @param directory*/private static void deleteFilesByDirectory(File directory) {if (directory != null && directory.exists() && directory.isDirectory()) {for (File item : directory.listFiles()) {item.delete();}}}// 获取文件//Context.getExternalFilesDir() --> SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据//Context.getExternalCacheDir() --> SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据public static long getFolderSize(File file) throws Exception {long size = 0;try {File[] fileList = file.listFiles();for (int i = 0; i < fileList.length; i++) {// 如果下面还有文件if (fileList[i].isDirectory()) {size = size + getFolderSize(fileList[i]);} else {size = size + fileList[i].length();}}} catch (Exception e) {e.printStackTrace();}return size;}/*** 删除指定目录下文件及目录* * @param deleteThisPath* @param filepath* @return*/public static void deleteFolderFile(String filePath, boolean deleteThisPath) {if (!TextUtils.isEmpty(filePath)) {try {File file = new File(filePath);if (file.isDirectory()) {// 如果下面还有文件File files[] = file.listFiles();for (int i = 0; i < files.length; i++) {deleteFolderFile(files[i].getAbsolutePath(), true);}}if (deleteThisPath) {if (!file.isDirectory()) {// 如果是文件,删除file.delete();} else {// 目录if (file.listFiles().length == 0) {// 目录下没有文件或者目录,删除file.delete();}}}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}/*** 格式化单位* * @param size* @return*/public static String getFormatSize(double size) {double kiloByte = size / 1024;if (kiloByte < 1) {return size + "Byte";}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";}public static String getCacheSize(File file) throws Exception {return getFormatSize(getFolderSize(file));}}

Android记录20-获取缓存大小和清除缓存功能相关推荐

  1. Android中获取缓存大小和清除缓存功能

    前言 本篇博客要给大家分享的如何获取应用缓存的大小和清除缓存的功能,我们知道我们应用当中经常会产生一些数据,比如图片的缓存,数据库文件,配置文件等等.我们开发产品的时候,可能会有这样的一个需求清除应用 ...

  2. android 自动清理缓存图片吗,Android中Glide获取缓存大小并清除缓存图片

    清除Glide缓存 Glide自带清除缓存的功能,分别对应Glide.get(context).clearDiskCache();(清除磁盘缓存)与Glide.get(context).clearMe ...

  3. ios html清除缓存,iOS开发之1行代码实现缓存计算及清除缓存

    话不多说,直接撸代码 // // gzhCache.h // cache // // Created by 郭志贺 on 2020/5/27. // Copyright © 2020 郭志贺. All ...

  4. iOS获取缓存文件的大小并清除缓存

    移动应用在处理网络资源时,一般都会做离线缓存处理,其中以图片缓存最为典型,其中很流行的离线缓存框架为SDWebImage. 但是,离线缓存会占用手机存储空间,所以缓存清理功能基本成为资讯.购物.阅读类 ...

  5. 计算SDWebImage缓存大小以及清除

    为什么80%的码农都做不了架构师?>>>    #import <SDWebImage/UIImageView+WebCache.h>// 计算文件大小 - (NSStr ...

  6. Nginx的Web缓存服务及清除缓存

    这一篇记录一下Nginx作为Web服务器缓存,减少对应用服务器请求次数 ,各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟.多谢! Nginx作为Web缓存 ...

  7. flutter 显示缓存大小,清理缓存功能

    Flutter 获取应用缓存需要借助于path_provider插件. path_provider 是一个用于查找文件系统上常用位置的Flutter插件.用来获取 Android 和 iOS 的缓存文 ...

  8. 清除数据和缓存是什么_什么是缓存数据? 清除缓存的含义是什么?

    清除数据和缓存是什么 首先,什么是缓存? (First, what's a cache?) In general terms, a cache (pronounced "cash" ...

  9. RN:metro缓存以及如何清除缓存

    背景 我们在执行 yarn start/build 的时候会实时检测打包更新,有了缓存之后可以对一些没有变换的文件不进行更新,大大节省了打包速度. 缓存类型 metro 的缓存实现在 node_mod ...

最新文章

  1. iOS学习资源(二)
  2. python word转pdf
  3. IO流(六)之CharArrayReader类与CharArrayWriter类
  4. php负载均衡面板,nginx负载均衡的五种策略
  5. [ATF]-ATF启动--BL31跳转到optee和uboot
  6. 利用BADI ME_PROCESS_PO_CUST進行PO check
  7. c++ socket编程_C/C++中的Socket编程
  8. 如何使用SAP Analytics Cloud统计C4C系统每天新建的Lead个数和预测趋势
  9. SAP CRM产品主数据明细页面无法打开的调试步骤
  10. 雅诗兰黛天猫超级品牌日:未央唇膏、红装小棕瓶“当红不让”
  11. graphviz安装以及入门
  12. 程序员必须掌握的 12 个 JavaScript 技能!
  13. 用Win2003做×××借线
  14. python 建站 上传文件_python往网站上传数据
  15. snmp扫描工具linux,SugarNMSTool-SugarNMSTool(snmp工具)下载 v2.0官方版--pc6下载站
  16. 13.分布式锁面试题(高频面试题)
  17. 2020-12-24《重学操作系统——上》林䭽 前阿里巴巴高级技术专家(P8)
  18. 有实用简单的PS小技巧吗?下面几个小技巧你知道几个呢?
  19. 百度快照劫持代码的更新
  20. ArcGIS API For JavaScript官方文档之Dojo

热门文章

  1. 用Spring Boot Admin来监控我们的微服务
  2. 淘宝礼品代发注意事项有哪些?
  3. FPGA学习常用网站推荐
  4. 时间戳 和 时间的相互转换
  5. 信用社考试计算机知识,信用社考试(计算机基础知识 六)
  6. 新年芯事 | 龙芯物联网主控芯片龙芯1C102和龙芯1C103流片成功
  7. 关于软件文档 这些你知道吗?
  8. 10.22css基础02
  9. 做一个派发工单的微信小程序
  10. small cell 推动创新应用