天天看點

android之清理緩存實作

android之清理緩存實作

一. 清理緩存首先要搞清楚清理哪些東西,

  1. app本身的功能比如錄像,錄音,更新都會産生檔案,需要清理
  2. app的預設緩存位址cache

二. 搞清楚要清理的檔案夾位置

  1. 首先app自身的功能就要看自己把它放在了什麼位置
  2. 預設緩存位址:getActivity().getExternalCacheDir();

    這個位置是在storage/emulated/0/Android/data/com.xxxxxapp/cache

三. 搞起

代碼功能子產品:

  1. 擷取app緩存大小,以位元組為機關
  2. 擷取某個檔案夾的大小,以位元組為機關
  3. 把位元組機關換算成常用機關
  4. 把緩存大小設定到頁面,清理前一次,清理後一次
  5. 删除檔案夾功能
  6. 清除app緩存
/**
     * 擷取app的緩存大小
     * 1. 錄制的視訊/storage/emulated/0/xueliangapp/video/1573972925136.mp4
     * 2. 錄制的音頻/storage/emulated/0/xueliangapp/radio/1573972925136.amr
     * 3. 下載下傳的更新包/storage/emulated/0/Android/data/com.sdxzt.xueliangapp_v3/files/Download/xueliang_update.apk
     * 4. 緩存/storage/emulated/0/Android/data/com.sdxzt.xueliangapp_v3/cache
     */
    File videoDir,radioDir,filesDir,cacheDir;
    private String  getAppCache(){
        long fileSize = 0;
        String cacheSize = "0KB";
        videoDir  = new File(Environment.getExternalStorageDirectory()+"/xueliangapp/video");
        Log.d(TAG, "getAppCache: videoDir大小: "+getDirSize(videoDir));
        radioDir  = new File(Environment.getExternalStorageDirectory()+"/xueliangapp/radio");
        Log.d(TAG, "getAppCache: radioDir大小: "+getDirSize(radioDir));
        filesDir = getActivity().getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
        Log.d(TAG, "getAppCache: filesDir大小: "+getDirSize(filesDir));
        ///storage/emulated/0/Android/data/com.sdxzt.xueliangapp_v3/files,這裡面有download檔案夾,裡面是下載下傳的更新包
        cacheDir = getActivity().getExternalCacheDir();
        Log.d(TAG, "getAppCache: cacheDir大小: "+getDirSize(cacheDir));
        ///storage/emulated/0/Android/data/com.sdxzt.xueliangapp_v3/cache
        fileSize += getDirSize(getActivity().getFilesDir());
        fileSize += getDirSize(getActivity().getCacheDir());//這行是預設的緩存位址,看圖檔什麼的會在這裡積累緩存
        fileSize += getDirSize(videoDir);
        fileSize += getDirSize(radioDir);
        fileSize += getDirSize(filesDir);
        fileSize += getDirSize(cacheDir);
        String fileSizeStr = formatFileSize(fileSize);
        Log.d(TAG, "getAppCache: 總緩存大小: "+fileSizeStr);
        return  fileSizeStr;
    }

    /**
     * 擷取檔案大小(位元組為機關)
     * @param dir
     * @return
     */
    private 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 fileSize
     * @return
     */
    private String formatFileSize(long fileSize){
        DecimalFormat df = new DecimalFormat("#0.00");//表示小數點前至少一位,0也會顯示,後保留兩位

        String fileSizeString = "";
       if (fileSize < 1024) {
            fileSizeString = df.format((double) fileSize) + "B";
        } else if (fileSize < 1048576) {
            fileSizeString = df.format((double) fileSize / 1024) + "KB";
        } else if (fileSize < 1073741824) {
            fileSizeString = df.format((double) fileSize / 1048576) + "MB";
        } else {
            fileSizeString = df.format((double) fileSize / 1073741824) + "G";
        }
        return fileSizeString;
    }
    private void setAppCache() {
        String fileSize = getAppCache();
        fileSizeTv.setText(fileSize);
        Log.d(TAG, "setAppCache: 重新顯示緩存大小");
        Log.d(TAG, "setAppCache: 目前緩存"+fileSize);
    }

    public  void clearAppCache(final Activity activity){

        final Handler handler = new Handler(){
            @Override
            public void handleMessage(@NonNull Message msg) {
                super.handleMessage(msg);
                Log.d(TAG, "handlerMessage: ");
                if (msg.what == 1) {
                    setAppCache();
                    Log.d(TAG, "handlerMessage: 緩存清除完畢");
                    ToastUtil.showMsg(getActivity(),"緩存清除完畢");
                }else {
                    ToastUtil.showMsg(getActivity(),"緩存清除失敗");
                    Log.d(TAG, "handlerMessage: 緩存清除失敗");
                }
            }
        };

        new Thread(new Runnable() {
            @Override
            public void run() {
                Log.d(TAG, "run: ");
                Message msg = new Message();
                try {
                    clearCacheFolder(videoDir,System.currentTimeMillis());
                    clearCacheFolder(radioDir,System.currentTimeMillis());
                    clearCacheFolder(filesDir,System.currentTimeMillis());
                    clearCacheFolder(cacheDir,System.currentTimeMillis());
                    msg.what = 1;
                }catch (Exception e){
                    e.printStackTrace();
                    msg.what = -1;
                }
                handler.sendMessage(msg);
            }
        }).start();
    }


    /**
     * 清除緩存目錄
     * @param dir 目錄
     * @param curTime 目前系統時間
     */
    private int clearCacheFolder(File dir,long curTime){
        int deletedFiles = 0;
        if (dir!= null && dir.isDirectory()) {
            try {
                for (File child:dir.listFiles()) {
                    if (child.isDirectory()) {
                        deletedFiles += clearCacheFolder(child, curTime);
                    }
                    if (child.lastModified() < curTime) {
                        if (child.delete()) {
                            deletedFiles++;
                        }
                    }
                }
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
        Log.d(TAG, "clearCacheFolder: 清除目錄: "+dir.getAbsolutePath());
        return deletedFiles;
  }
           

繼續閱讀