安卓应用清除缓存一般清理目录和代码(带弹框

一个应用安装完成,会有缓存,缓存一般分为内部存储的和外置的,内存中路径为/data/data/pacgage_name/文件,先来看看一般缓存会存在哪些文件中:

(1)缓存文件夹:

/data/data/com.xx/cache
(2)sharePreferance文件夹:

/data/data/com.xx/shared_prefs
(3)DB数据库文件夹:

/data/data/com.xx/databases
(4)files文件夹:(指向同一文件夹)
context.getFilesDir()

/data/data/com.xx/files

(5)外置缓存文件夹:context.getExternalCacheDir()

(6)lib文件夹,一般可以不清理该文件夹:

"/data/data/com.gtafe.zhpj/lib"

一般一个应用的缓存都存在这些文件夹中,接下直接上代码吧,把计算缓存和清除缓存都用一个类封装(带弹框):

[java]  view plain  copy
  1. /** 
  2.  * Created by lan.zheng on 2016/9/1. 
  3.  */  
  4. public class CacheUtil {  
  5.     private static final String CACHE_DATA_DB = "/data/data/com.gtafe.zhpj/databases";  
  6.     private static final String CACHE_DATA_SF = "/data/data/com.gtafe.zhpj/shared_prefs";  
  7.     private static final String CACHE_DATA_CACHE = "/data/data/com.gtafe.zhpj/cache";  
  8.     private static File lFileDB;  
  9.     private static File lFileSF;  
  10.     private static File lFileC;  
  11.     /** 
  12.      * 获取所有缓存 
  13.      * @param context 
  14.      * @return 
  15.      * @throws Exception 
  16.      */  
  17.     public static String getTotalCacheSize(Context context) throws Exception {  
  18.         lFileDB = new File(CACHE_DATA_DB);  
  19.         lFileSF = new File(CACHE_DATA_SF);  
  20.         lFileC = new File(CACHE_DATA_CACHE);  
  21.         //内存缓存DB和SF,cache,files文件  
  22.         long cacheSizeDB = getFolderSize(lFileDB);  
  23.         long cacheSizeSF = getFolderSize(lFileSF);  
  24.         long cacheSizeC = getFolderSize(lFileC);  
  25.         long cacheSize = cacheSizeDB + cacheSizeSF + cacheSizeC + getFolderSize(context.getFilesDir());  //context.getFilesDir()或者像上面一样直接用路径  
  26.         //fresco产生的cache,如果需要就加入下面这行代码  
  27.         //long cacheSizeFresco = Fresco.getImagePipelineFactory().getMainDiskStorageCache().getSize();  
  28.         cacheSize = cacheSize +  cacheSizeFresco;  
  29.         if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {  
  30.             cacheSize = cacheSize +  getFolderSize(context.getExternalCacheDir());  
  31.         }  
  32.         return getFormatSize(cacheSize);  
  33.     }  
  34.   
  35.     /** 
  36.      * 清除所有缓存 
  37.      * @param context 
  38.      * @return 
  39.      */  
  40.     static boolean isClearSuccess = true;  
  41.     public static void clearAllCache(Context context,ShowClearResultListener showClearResultListener) {  
  42.         mListener = showClearResultListener;  //监听初始化  
  43.         showWaitingDialog(context);  //弹框等待  
  44.         //清理Fresco的缓存  
  45.         ImagePipeline imagePipeline = Fresco.getImagePipeline();  
  46.         imagePipeline.clearCaches();  
  47.         //清理内存和文件缓存  
  48.         isClearSuccess = deleteDir(lFileDB);  
  49.         isClearSuccess = deleteDir(lFileSF);  
  50.         isClearSuccess = deleteDir(lFileC);  
  51.         isClearSuccess = deleteDir(context.getFilesDir());  
  52.         if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {  
  53.             isClearSuccess = deleteDir(context.getExternalCacheDir());  
  54.         }  
  55.   
  56.         //TODO 别的缓存  
  57.        /* if(context.getCacheDir() != null){ 
  58.             deleteDir(context.getCacheDir()); 
  59.         }*/  
  60.     }  
  61.   
  62.     private static boolean deleteDir(File dir) {  
  63.         if (dir != null && dir.isDirectory()) {  
  64.             String[] children = dir.list();  
  65.             for (int i = 0; i < children.length; i++) {  
  66.                 boolean success = deleteDir(new File(dir, children[i]));  
  67.                 if (!success) {  
  68.                     return false;  
  69.                 }  
  70.             }  
  71.         }  
  72.         return dir.delete();  
  73.     }  
  74.   
  75.     // 获取文件  
  76.     //Context.getExternalFilesDir() --> SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据  
  77.     //Context.getExternalCacheDir() --> SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据  
  78.     public static long getFolderSize(File file) throws Exception {  
  79.         long size = 0;  
  80.         try {  
  81.             File[] fileList = file.listFiles();  
  82.             for (int i = 0; i < fileList.length; i++) {  
  83.                 Log.d("test11","file"+i+" = "+fileList[i].toString());  
  84.                 // 如果下面还有文件  
  85.                 if (fileList[i].isDirectory()) {  
  86.                     size = size + getFolderSize(fileList[i]);  
  87.                 } else {  
  88.                     size = size + fileList[i].length();  
  89.                 }  
  90.             }  
  91.         } catch (Exception e) {  
  92.             e.printStackTrace();  
  93.         }  
  94.         return size;  
  95.     }  
  96.   
  97.     /** 
  98.      * 格式化单位 
  99.      * 
  100.      * @param size 
  101.      * @return 
  102.      */  
  103.     public static String getFormatSize(double size) {  
  104.         double kiloByte = size / 1024;  
  105.         if (kiloByte < 1) {  
  106. //            return size + "Byte";  
  107.             return "0.0M";  
  108.         }  
  109.   
  110.         double megaByte = kiloByte / 1024;  
  111.         if (megaByte < 1) {  
  112.             BigDecimal result1 = new BigDecimal(Double.toString(kiloByte));  
  113.             return result1.setScale(2, BigDecimal.ROUND_HALF_UP)  
  114.                     .toPlainString() + "KB";  
  115.         }  
  116.   
  117.         double gigaByte = megaByte / 1024;  
  118.         if (gigaByte < 1) {  
  119.             BigDecimal result2 = new BigDecimal(Double.toString(megaByte));  
  120.             return result2.setScale(2, BigDecimal.ROUND_HALF_UP)  
  121.                     .toPlainString() + "MB";  
  122.         }  
  123.   
  124.         double teraBytes = gigaByte / 1024;  
  125.         if (teraBytes < 1) {  
  126.             BigDecimal result3 = new BigDecimal(Double.toString(gigaByte));  
  127.             return result3.setScale(2, BigDecimal.ROUND_HALF_UP)  
  128.                     .toPlainString() + "GB";  
  129.         }  
  130.         BigDecimal result4 = new BigDecimal(teraBytes);  
  131.         return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString()  
  132.                 + "TB";  
  133.     }  
  134.   
  135.   
  136.     /** 
  137.      * 弹框确认方法 
  138.      */  
  139.     public static void showWaitingDialog(Context context){  
  140.         //弹框  
  141.         popupConfirmDialog(context , "清除中...", R.mipmap.ic_clear_cache);  
  142.     }  
  143.   
  144.   
  145.     private static Dialog modifyDialog;  
  146.     static ShowClearResultListener mListener;  
  147.     private static void popupConfirmDialog(Context context, String content, int resId) {  
  148.         //弹框内容  
  149.         if (modifyDialog == null) {  
  150.             View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_waiting_for_opr, null);  
  151.             TextView modifyContent = (TextView) contentView.findViewById(R.id.dialog_content_text);  
  152.             modifyContent.setText(content);  
  153.             ImageView modifyImage = (ImageView)contentView.findViewById(R.id.dialog_content_image);  
  154.             modifyImage.setImageDrawable(context.getResources().getDrawable(resId));  
  155.             modifyDialog = new Dialog(context, R.style.clearCacheDialogTheme);  //使用自定义的样式  
  156.             modifyDialog.setCanceledOnTouchOutside(false);  //外围点击不消失  
  157.             modifyDialog.setContentView(contentView);  
  158.         }  
  159.         modifyDialog.show();  
  160.         sleepToWaitClear();  
  161.     }  
  162.   
  163.     static Handler mHandler = new Handler();  
  164.     private static void sleepToWaitClear(){  
  165.         mHandler.postDelayed(mRunnableDialogDismiss,1000);  //延迟启动  
  166.     }  
  167.   
  168.     private static Runnable mRunnableDialogDismiss = new Runnable() {  
  169.         @Override  
  170.         public void run() {  
  171.             if(modifyDialog != null ){  
  172.                 modifyDialog.dismiss();  
  173.                 modifyDialog = null;  
  174.                 mListener.Clear(isClearSuccess);  
  175.             }  
  176.         }  
  177.     };  
  178.   
  179.     /** 
  180.      * 1秒后回调清除结果 
  181.      */  
  182.     public interface ShowClearResultListener{  
  183.         void Clear(boolean isClear);  
  184.     }  
  185.   
  186. }  

弹框的样式调用:

[html]  view plain  copy
  1. <!-- 清除缓存弹框样式 -->  
  2.     <style name="clearCacheDialogTheme" parent="android:Theme.Dialog">  
  3.         <item name="android:windowFrame">@null</item>  
  4.         <item name="android:windowIsFloating">true</item>  
  5.         <item name="android:windowIsTranslucent">true</item>  
  6.         <item name="android:windowNoTitle">true</item><!--除去title-->  
  7.         <item name="android:backgroundDimEnabled">true</item>  
  8.         <item name="android:backgroundDimAmount">0.3</item><!-- 背景灰度 -->  
  9.         <item name="android:windowBackground">@color/transparent</item><!--除去背景色,透明-->  
  10.         <item name="android:radius">8dp</item>  
  11.     </style>  


封装的弹框代码(圆角代码省略@drawable/dialog_content_radius):

[html]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.               android:layout_width="wrap_content"  
  4.               android:layout_height="wrap_content"  
  5.               android:background="@drawable/dialog_content_radius"  
  6.               android:paddingTop="@dimen/hdp_20.0"  
  7.               android:paddingBottom="@dimen/hdp_20.0"  
  8.               android:paddingLeft="@dimen/wdp_20.0"  
  9.               android:paddingRight="@dimen/wdp_20.0"  
  10.               android:orientation="vertical"  
  11.               android:gravity="center"  
  12.               android:layout_gravity="center">  
  13.   
  14.         <ImageView  
  15.             android:paddingBottom="@dimen/hdp_20.0"  
  16.             android:paddingLeft="@dimen/wdp_80.0"  
  17.             android:paddingRight="@dimen/wdp_80.0"  
  18.             android:id="@+id/dialog_content_image"  
  19.             android:layout_width="wrap_content"  
  20.             android:layout_height="wrap_content"  
  21.             android:src="@mipmap/ic_clear_cache"/>  
  22.   
  23.         <TextView  
  24.             android:id="@+id/dialog_content_text"  
  25.             android:layout_width="match_parent"  
  26.             android:layout_height="wrap_content"  
  27.             android:ellipsize="end"  
  28.             android:maxLines="5"  
  29.             android:text="含笑半步癫"  
  30.             android:textSize="@dimen/sp_16.0"  
  31.             android:textColor="@color/text_666666"  
  32.             android:gravity="center"/>  
  33. </LinearLayout>  
最后就是在主函数中使用了:

(1)获取缓存大小:


[java]  view plain  copy
  1. String cacheSize=CacheUtil.getTotalCacheSize(this);  
  2.             cache_size.setText(cacheSize);  

(2)清除缓存:

[java]  view plain  copy
  1. CacheUtil.clearAllCache(UserCenterActivity.thisnew CacheUtil.ShowClearResultListener() {  
  2.                     @Override  
  3.                     public void Clear(boolean isClear) {  
  4.                         if(isClear){  
  5.                            cache_size.setText("0.0M");  
  6.                         }  
  7.                     }  
  8.                 });  
以上就是清除缓存的方法,最后发现一个问题,在安卓4.4一下的系统中清除缓存后和管理器看到的结果是一样的,但是 4.4以上的系统在管理器显示还是有些缓存没被清除,这个问题有人知道为什么吗?

猜你喜欢

转载自blog.csdn.net/zhang1223665986/article/details/80709077
今日推荐