Android中缓存的清理

      Android应用开发中,往往会遇到内存的存储和清理问题,前几天的应用中,有一个功能为“缓存清理”,即把应用的缓存内容清空从而减少内存的消耗,为此,自己写了一个小Demo,实现了该功能。

1、首先,对一些概念要有一些了解: 

getCacheDir()、getFilesDir()、getExternalFilesDir()、getExternalCacheDir()的区别:
getCacheDir()方法用于获取/data/data/<application package>/cache目录
getFilesDir()方法用于获取/data/data/<application package>/files目录
应用程序在运行的时候,如果需要保存数据,一般数据是存储在SDcard中的。大部分应用是直接在 SDCard的根目录下创建一个 文件夹 ,然后把数据保存在该文件夹中。通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据;通过Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据。
2、关于Environment类的一些说法:

要想实现对SDCard的读取操作,只需要按以下几个步骤就行:
1、 先判断这台手机设备上是否有SDCard且具有读写SDCard的权限
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
2、 调用Environment.getExternalStorageDirectory()获得到外部存储器的目录
3、 使用IO流对外部存储器进行文件的读写
4、 别忘记了要在AndroidMainfest.xml中添加权限
<!-- 在SDCard中创建与删除文件权限 -->   
<uses-permission   android:name = "android.permission.MOUNT_UNMOUNT_FILESYSTEMS"   />   
<!-- 往SDCard中写入数据权限 -->
<uses-permission   android:name = "android.permission.WRITE_EXTERNAL_STORAGE"   />  

3、对于BigDecimal的了解:
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。在 BigDecimal中:
ROUND_HALF_UP: 遇到.5的情况时往上近似,例: 1.5 ->;2
ROUND_HALF_DOWN : 遇到.5的情况时往下近似,例: 1.5 ->;1
BigDecimal.setScale()方法用于格式化小数点
setScale(1)表示保留一位小数,默认用四舍五入方式
setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3
setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4
setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4
setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍
4、代码演示:
public class DataCleanManager {
/**
* 计算缓存大小
* @param context
* @return
* @throws Exception
*/
public static String getTotalCacheSize(Context context)throws Exception{
//getCacheDir()方法用于获取/data/data/<application package>/cache目录
long cacheSize = getFolderSize(context.getCacheDir());
//Environment.getExternalStorageState()获得Android外部存储器的当前状态
//Environment.MEDIA_MOUNTED当前Android的外部存储器可读可写
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
//getExternalCacheDir()方法用于获取SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据。
cacheSize += getFolderSize(context.getExternalCacheDir());
}
return getFormatSize(cacheSize);
}

/**
* 清空缓存
* @param context
*/
public static void clearAllCache(Context context){
deleteDir(context.getCacheDir());
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
deleteDir(context.getExternalCacheDir());
}
}

private static boolean deleteDir(File dir){
if(dir != null && dir.isDirectory()){
String [] children = dir.list();
for(int i = 0;i < children.length;i++){
boolean success = deleteDir(new File(dir,children[i]));
if(!success){
return false;
}
}
}
return dir.delete();
}
/**
* 获取文件
* @param file
* @return
* @throws Exception
*/
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 size
* @return
* ROUND_HALF_UP: 遇到.5的情况时往上近似,例: 1.5 ->;2
*ROUND_HALF_DOWN : 遇到.5的情况时往下近似,例: 1.5 ->;1
* BigDecimal.setScale()方法用于格式化小数点
* setScale(1)表示保留一位小数,默认用四舍五入方式
* setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3
* setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4
* setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4
* setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍
*
*/
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 gegaByte = megaByte / 1024 ;
if(gegaByte < 1){
BigDecimal result2 = new BigDecimal(Double.toString(megaByte));
return result2.setScale(2,BigDecimal.ROUND_HALF_UP).toPlainString() + "MB";
}

double teraByte = gegaByte / 1024 ;
if(teraByte < 1){
BigDecimal result3 = new BigDecimal(Double.toString(gegaByte));
return result3.setScale(2,BigDecimal.ROUND_HALF_UP).toPlainString() + "GB";
}

BigDecimal result4 = new BigDecimal(teraByte);
return result4.setScale(2,BigDecimal.ROUND_HALF_UP).toPlainString() + "TB";
}
}





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值