Android应用开发之Android应用清除缓存一般清理目录和代码的教程
白羽 2018-12-19 来源 :网络 阅读 796 评论 0

摘要:本文将带你了解Android应用开发Android应用清除缓存一般清理目录和代码的教程,希望本文对大家学Android有所帮助。

    本文将带你了解Android应用开发Android应用清除缓存一般清理目录和代码的教程,希望本文对大家学Android有所帮助。


   

一个应用安装完成,会有缓存,缓存一般分为内部存储的和外置的,内存中路径为/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

/** 

 * Created by lan.zheng on 2016/9/1. 

 */  

public class CacheUtil {  

    private static final String CACHE_DATA_DB = "/data/data/com.gtafe.zhpj/databases";  

    private static final String CACHE_DATA_SF = "/data/data/com.gtafe.zhpj/shared_prefs";  

    private static final String CACHE_DATA_CACHE = "/data/data/com.gtafe.zhpj/cache";  

    private static File lFileDB;  

    private static File lFileSF;  

    private static File lFileC;  

    /** 

     * 获取所有缓存 

     * @param context 

     * @return 

     * @throws Exception 

     */  

    public static String getTotalCacheSize(Context context) throws Exception {  

        lFileDB = new File(CACHE_DATA_DB);  

        lFileSF = new File(CACHE_DATA_SF);  

        lFileC = new File(CACHE_DATA_CACHE);  

        //内存缓存DB和SF,cache,files文件  

        long cacheSizeDB = getFolderSize(lFileDB);  

        long cacheSizeSF = getFolderSize(lFileSF);  

        long cacheSizeC = getFolderSize(lFileC);  

        long cacheSize = cacheSizeDB + cacheSizeSF + cacheSizeC + getFolderSize(context.getFilesDir());  //context.getFilesDir()或者像上面一样直接用路径  

        //fresco产生的cache,如果需要就加入下面这行代码  

        //long cacheSizeFresco = Fresco.getImagePipelineFactory().getMainDiskStorageCache().getSize();  

        cacheSize = cacheSize +  cacheSizeFresco;  

        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {  

            cacheSize = cacheSize +  getFolderSize(context.getExternalCacheDir());  

        }  

        return getFormatSize(cacheSize);  

    }  

  

    /** 

     * 清除所有缓存 

     * @param context 

     * @return 

     */  

    static boolean isClearSuccess = true;  

    public static void clearAllCache(Context context,ShowClearResultListener showClearResultListener) {  

        mListener = showClearResultListener;  //监听初始化  

        showWaitingDialog(context);  //弹框等待  

        //清理Fresco的缓存  

        ImagePipeline imagePipeline = Fresco.getImagePipeline();  

        imagePipeline.clearCaches();  

        //清理内存和文件缓存  

        isClearSuccess = deleteDir(lFileDB);  

        isClearSuccess = deleteDir(lFileSF);  

        isClearSuccess = deleteDir(lFileC);  

        isClearSuccess = deleteDir(context.getFilesDir());  

        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {  

            isClearSuccess = deleteDir(context.getExternalCacheDir());  

        }  

  

        //TODO 别的缓存  

       /* if(context.getCacheDir() != null){ 

            deleteDir(context.getCacheDir()); 

        }*/  

    }  

  

    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();  

    }  

  

    // 获取文件  

    //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++) {  

                Log.d("test11","file"+i+" = "+fileList[i].toString());  

                // 如果下面还有文件  

                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 

     */  

    public static String getFormatSize(double size) {  

        double kiloByte = size / 1024;  

        if (kiloByte < 1) {  

//            return size + "Byte";  

            return "0.0M";  

        }  

  

        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 void showWaitingDialog(Context context){  

        //弹框  

        popupConfirmDialog(context , "清除中...", R.mipmap.ic_clear_cache);  

    }  

  

  

    private static Dialog modifyDialog;  

    static ShowClearResultListener mListener;  

    private static void popupConfirmDialog(Context context, String content, int resId) {  

        //弹框内容  

        if (modifyDialog == null) {  

            View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_waiting_for_opr, null);  

            TextView modifyContent = (TextView) contentView.findViewById(R.id.dialog_content_text);  

            modifyContent.setText(content);  

            ImageView modifyImage = (ImageView)contentView.findViewById(R.id.dialog_content_image);  

            modifyImage.setImageDrawable(context.getResources().getDrawable(resId));  

            modifyDialog = new Dialog(context, R.style.clearCacheDialogTheme);  //使用自定义的样式  

            modifyDialog.setCanceledOnTouchOutside(false);  //外围点击不消失  

            modifyDialog.setContentView(contentView);  

        }  

        modifyDialog.show();  

        sleepToWaitClear();  

    }  

  

    static Handler mHandler = new Handler();  

    private static void sleepToWaitClear(){  

        mHandler.postDelayed(mRunnableDialogDismiss,1000);  //延迟启动  

    }  

  

    private static Runnable mRunnableDialogDismiss = new Runnable() {  

        @Override  

        public void run() {  

            if(modifyDialog != null ){  

                modifyDialog.dismiss();  

                modifyDialog = null;  

                mListener.Clear(isClearSuccess);  

            }  

        }  

    };  

  

    /** 

     * 1秒后回调清除结果 

     */  

    public interface ShowClearResultListener{  

        void Clear(boolean isClear);  

    }  

  

}  

弹框的样式调用:

[html] view plain copy

<!-- 清除缓存弹框样式 -->  

    <style name="clearCacheDialogTheme" parent="android:Theme.Dialog">  

        <item name="android:windowFrame">@null</item>  

        <item name="android:windowIsFloating">true</item>  

        <item name="android:windowIsTranslucent">true</item>  

        <item name="android:windowNoTitle">true</item><!--除去title-->  

        <item name="android:backgroundDimEnabled">true</item>  

        <item name="android:backgroundDimAmount">0.3</item><!-- 背景灰度 -->  

        <item name="android:windowBackground">@color/transparent</item><!--除去背景色,透明-->  

        <item name="android:radius">8dp</item>  

    </style>  

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

[html] view plain copy

<?xml version="1.0" encoding="utf-8"?>  

<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"  

              android:layout_width="wrap_content"  

              android:layout_height="wrap_content"  

              android:background="@drawable/dialog_content_radius"  

              android:paddingTop="@dimen/hdp_20.0"  

              android:paddingBottom="@dimen/hdp_20.0"  

              android:paddingLeft="@dimen/wdp_20.0"  

              android:paddingRight="@dimen/wdp_20.0"  

              android:orientation="vertical"  

              android:gravity="center"  

              android:layout_gravity="center">  

  

        <ImageView  

            android:paddingBottom="@dimen/hdp_20.0"  

            android:paddingLeft="@dimen/wdp_80.0"  

            android:paddingRight="@dimen/wdp_80.0"  

            android:id="@+id/dialog_content_image"  

            android:layout_width="wrap_content"  

            android:layout_height="wrap_content"  

            android:src="@mipmap/ic_clear_cache"/>  

  

        <TextView  

            android:id="@+id/dialog_content_text"  

            android:layout_width="match_parent"  

            android:layout_height="wrap_content"  

            android:ellipsize="end"  

            android:maxLines="5"  

            android:text="含笑半步癫"  

            android:textSize="@dimen/sp_16.0"  

            android:textColor="@color/text_666666"  

            android:gravity="center"/>  

</LinearLayout>  

最后就是在主函数中使用了:

(1)获取缓存大小:

[java] view plain copy

String cacheSize=CacheUtil.getTotalCacheSize(this);  

            cache_size.setText(cacheSize);  

(2)清除缓存:

[java] view plain copy

CacheUtil.clearAllCache(UserCenterActivity.this, new CacheUtil.ShowClearResultListener() {  

                    @Override  

                    public void Clear(boolean isClear) {  

                        if(isClear){  

                           cache_size.setText("0.0M");  

                        }  

                    }  

                });  


          

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程