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类的一些说法:

android 清除进程的内存 android 清除缓存_缓存




要想实现对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"; 
   
    

     } 
   
    

     }