zoukankan      html  css  js  c++  java
  • android 端缓存清理的实现

    首先关于缓存清理,网上已经有太多的工具类,但是遗憾的是,基本上都不完善,或者说根本就不能用,而项目中又要求实现这个烂东西(其实这玩意真没一点屁用,毕竟第三方清理/杀毒软件都带这么一个功能),但是只好硬着头皮搞搞.. 随记录如下:

    先上图

    当点击清理缓存 这个LinearLayout 弹出对话框,

    代码如下:

     case R.id.rl_clean_cache://清理缓存
                    onClickCleanCache();
                    break;
    //------****** 缓存相关****----------
        private final int CLEAN_SUC=1001;
        private final int CLEAN_FAIL=1002;
        private void onClickCleanCache() {
            getConfirmDialog(getActivity(), "是否清空缓存?", new DialogInterface.OnClickListener
                    () {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    clearAppCache();
                    tvCache.setText("0KB");
                }
            }).show();
        }
        public static AlertDialog.Builder getConfirmDialog(Context context, String message, DialogInterface.OnClickListener onClickListener) {
            AlertDialog.Builder builder = getDialog(context);
            builder.setMessage(Html.fromHtml(message));
            builder.setPositiveButton("确定", onClickListener);
            builder.setNegativeButton("取消", null);
            return builder;
        }
        public static AlertDialog.Builder getDialog(Context context) {
            AlertDialog.Builder builder = new AlertDialog.Builder(context);
            return builder;
        }
    /**
         * 计算缓存的大小
         */
        private void caculateCacheSize() {
            long fileSize = 0;
            String cacheSize = "0KB";
            File filesDir = getActivity().getFilesDir();
            File cacheDir = getActivity().getCacheDir();
    
            fileSize += FileUtil.getDirSize(filesDir);
            fileSize += FileUtil.getDirSize(cacheDir);
            // 2.2版本才有将应用缓存转移到sd卡的功能
            if (isMethodsCompat(android.os.Build.VERSION_CODES.FROYO)) {
                File externalCacheDir = MethodsCompat
                        .getExternalCacheDir(getActivity());
                fileSize += FileUtil.getDirSize(externalCacheDir);
                fileSize += FileUtil.getDirSize(new File(
                        org.kymjs.kjframe.utils.FileUtils.getSDCardPath()
                                + File.separator + "KJLibrary/cache"));
            }
            if (fileSize > 0)
                cacheSize = FileUtil.formatFileSize(fileSize);
            tvCache.setText(cacheSize);
        }
    
        public static boolean isMethodsCompat(int VersionCode) {
            int currentVersion = android.os.Build.VERSION.SDK_INT;
            return currentVersion >= VersionCode;
        }
        /**
         * 清除app缓存
         */
        public void myclearaAppCache() {
            DataCleanManager.cleanDatabases(getActivity());
            // 清除数据缓存
            DataCleanManager.cleanInternalCache(getActivity());
            // 2.2版本才有将应用缓存转移到sd卡的功能
            if (isMethodsCompat(android.os.Build.VERSION_CODES.FROYO)) {
                DataCleanManager.cleanCustomCache(MethodsCompat
                        .getExternalCacheDir(getActivity()));
            }
            // 清除编辑器保存的临时内容
            Properties props = getProperties();
            for (Object key : props.keySet()) {
                String _key = key.toString();
                if (_key.startsWith("temp"))
                    removeProperty(_key);
            }
            Core.getKJBitmap().cleanCache();
        }
    
        /**
         * 清除保存的缓存
         */
        public Properties getProperties() {
            return AppConfig.getAppConfig(getActivity()).get();
        }
        public void removeProperty(String... key) {
            AppConfig.getAppConfig(getActivity()).remove(key);
        }
        /**
         * 清除app缓存
         *
         * @param
         */
        public void clearAppCache() {
    
            new Thread() {
                @Override
                public void run() {
                    Message msg = new Message();
                    try {
                        myclearaAppCache();
                        msg.what = CLEAN_SUC;
                    } catch (Exception e) {
                        e.printStackTrace();
                        msg.what = CLEAN_FAIL;
                    }
                    handler.sendMessage(msg);
                }
            }.start();
        }
        private Handler handler = new Handler() {
            public void handleMessage(android.os.Message msg) {
                switch (msg.what) {
                    case CLEAN_FAIL:
                        ToastUtils.show(SxApplication.getInstance(),"清除失败");
                        break;
                    case CLEAN_SUC:
                        ToastUtils.show(SxApplication.getInstance(),"清除成功");
                        break;
                }
            };
        };

    以上代码位于一个 fragment中,代码中用到了2个工具如下所示:

    工具1:

    /**
     * 应用程序配置类:用于保存用户相关信息及设置
     */
    public class AppConfig {
    
        private final static String APP_CONFIG = "config";
    
        private Context mContext;
        private static AppConfig appConfig;
    
        public static AppConfig getAppConfig(Context context) {
            if (appConfig == null) {
                appConfig = new AppConfig();
                appConfig.mContext = context;
            }
            return appConfig;
        }
    
    
        public String get(String key) {
            Properties props = get();
            return (props != null) ? props.getProperty(key) : null;
        }
    
        public Properties get() {
            FileInputStream fis = null;
            Properties props = new Properties();
            try {
                // 读取files目录下的config
                // fis = activity.openFileInput(APP_CONFIG);
                // 读取app_config目录下的config
                File dirConf = mContext.getDir(APP_CONFIG, Context.MODE_PRIVATE);
                fis = new FileInputStream(dirConf.getPath() + File.separator
                        + APP_CONFIG);
    
                props.load(fis);
            } catch (Exception e) {
            } finally {
                try {
                    fis.close();
                } catch (Exception e) {
                }
            }
            return props;
        }
    
        private void setProps(Properties p) {
            FileOutputStream fos = null;
            try {
                // 把config建在files目录下
                // fos = activity.openFileOutput(APP_CONFIG, Context.MODE_PRIVATE);
    
                // 把config建在(自定义)app_config的目录下
                File dirConf = mContext.getDir(APP_CONFIG, Context.MODE_PRIVATE);
                File conf = new File(dirConf, APP_CONFIG);
                fos = new FileOutputStream(conf);
    
                p.store(fos, null);
                fos.flush();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    fos.close();
                } catch (Exception e) {
                }
            }
        }
    
        public void set(Properties ps) {
            Properties props = get();
            props.putAll(ps);
            setProps(props);
        }
    
        public void set(String key, String value) {
            Properties props = get();
            props.setProperty(key, value);
            setProps(props);
        }
    
        public void remove(String... key) {
            Properties props = get();
            for (String k : key)
                props.remove(k);
            setProps(props);
        }
    }

    工具2:

    /**
     * Android各版本的兼容方法
     */
    public class MethodsCompat {
        
        @TargetApi(5)
        public static void overridePendingTransition(Activity activity, int enter_anim, int exit_anim) {
               activity.overridePendingTransition(enter_anim, exit_anim);
        }
    
        @TargetApi(7)
        public static Bitmap getThumbnail(ContentResolver cr, long origId, int kind, Options options) {
               return MediaStore.Images.Thumbnails.getThumbnail(cr,origId,kind, options);
        }
        
        @TargetApi(8)
        public static File getExternalCacheDir(Context context) {
    
    //        // return context.getExternalCacheDir(); API level 8
    //
    //        // e.g. "<sdcard>/Android/data/<package_name>/cache/"
    //        final File extCacheDir = new File(Environment.getExternalStorageDirectory(),
    //            "/Android/data/" + context.getApplicationInfo().packageName + "/cache/");
    //        extCacheDir.mkdirs();
    //        return extCacheDir;
    
            return context.getExternalCacheDir();
        }
    
        @TargetApi(11)
        public static void recreate(Activity activity) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                activity.recreate();
            }
        }
    
        @TargetApi(11)
        public static void setLayerType(View view, int layerType, Paint paint) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                view.setLayerType(layerType, paint);
            }
        }
    
        @TargetApi(14)
        public static void setUiOptions(Window window, int uiOptions) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
                window.setUiOptions(uiOptions);
            }
        }
            

    还有FileUtil类

    public class FileUtil {
        /**
         * 获取目录文件大小
         *
         * @param dir
         * @return
         */
        public static long getDirSize(File dir) {
            if (dir == null) {
                return 0;
            }
            if (!dir.isDirectory()) {
                return 0;
            }
            long dirSize = 0;
            File[] files = dir.listFiles();
            for (File file : files) {
                if (file.isFile()) {
                    dirSize += file.length();
                } else if (file.isDirectory()) {
                    dirSize += file.length();
                    dirSize += getDirSize(file); // 递归调用继续统计
                }
            }
            return dirSize;
        }
    
        /**
         * 转换文件大小
         *
         * @param fileS
         * @return B/KB/MB/GB
         */
        public static String formatFileSize(long fileS) {
            java.text.DecimalFormat df = new java.text.DecimalFormat("#.00");
            String fileSizeString = "";
            if (fileS < 1024) {
                fileSizeString = df.format((double) fileS) + "B";
            } else if (fileS < 1048576) {
                fileSizeString = df.format((double) fileS / 1024) + "KB";
            } else if (fileS < 1073741824) {
                fileSizeString = df.format((double) fileS / 1048576) + "MB";
            } else {
                fileSizeString = df.format((double) fileS / 1073741824) + "G";
            }
            return fileSizeString;
        }
    }

    以上就是缓存清理了,完美搞定!

  • 相关阅读:
    索引,约束
    C# Dictionary 的几种遍历方法
    唯一性约束和唯一性索引的区别
    JS中offsetTop、clientTop、scrollTop、offsetTop各属性介绍
    Dictionary学习笔记嵌套Dictionary的遍历与排序(按Key值)(二)
    Dictionary学习笔记Dictionary定义与输出(一)
    集体智慧编程笔记搜索和排序
    emacs键盘映射
    集体智慧编程笔记推荐系统
    使用SRILM训练大的语言模型
  • 原文地址:https://www.cnblogs.com/android-zcq/p/5542946.html
Copyright © 2011-2022 走看看