Android中处理缓存
文章图片
今天早上如往常一样打开手机开始浏览新闻图片和视频,突然手机提示手机的缓存文件过大需要清理,出于职业敏感,于是起床,刷牙,洗脸打算写一篇自动利用代码清理缓存的文章。
首先,打开AndroidStudio准备先写一个测试一下是否可以,很显然没有毛病,下面我把刚写的代码贴出来,里面基本没有逻辑,挺简单的。
/**
* Created by luweicheng on 2016/12/13.
*/public class CacheDataManager {
/**
* 计算文件大小(Long型)
* @param dir
* @return
*/
private static long getFileSize(File dir){
long size = 0;
File[] fileList = dir.listFiles();
for (int i = 0;
i < fileList.length;
i++) {
if(fileList[i].isDirectory()){
size=+getFileSize(fileList[i]);
//迭代计算文件大小
}else{
size = fileList[i].length();
}}return size;
}/**
* 删除文件或者文件夹
* @param dir
*/
private static void deleteFile(File dir){
if(dir!=null && dir.isDirectory()){
File[] files = dir.listFiles();
for (int i = 0;
i < files.length;
i++) {
deleteFile(files[i]);
//迭代删除
}
}else if(dir != null && dir.isFile()){
dir.delete();
}
}/**
* 清除所有缓存
* @param context
*/
public static void ClearAllCache(Context context){
File dir1 = context.getCacheDir();
deleteFile(dir1);
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//判断sd卡是否挂载
File dir2 = context.getExternalCacheDir();
//获取sd卡缓存
deleteFile(dir2);
}
}/**
*
* 获取所用缓存大下
* @param context
* @return
*/
public static long getAllCacheSize(Context context){
long size = 0;
File dir1 = context.getCacheDir();
//获取内存缓存
size = getFileSize(dir1);
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File dir2 = context.getExternalCacheDir();
size =+ getFileSize(dir2);
}
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";
}
}
【android代码显示和清除缓存】是不是挺简单的,只不过以前很少去了解BigDecimal这个类,因为开始的时候,我直接没有去格式化缓存的大小直接打印出来的时候真是触目惊心,这个数字也太大了吧,而且小数点后面也有很多位,因为谷歌前两天将开发者网站能够不用爬梯子就能查看文档说明,对于一个四级没过的渣渣而言,文档只能读个大概,基本了解到BigDecimal是一个处理专门处理数字而且特别精确,经常用于商业汇率计算等。下面这段是BigDecimal的解释:
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。