1. 程式人生 > >Android記錄20-獲取快取大小和清除快取功能

Android記錄20-獲取快取大小和清除快取功能

Android開發記錄20-獲取快取大小和清除快取功能

轉載請註明:IT_xiao小巫 
部落格地址:http://blog.csdn.net/wwj_748

前言

本篇部落格要給大家分享的如何獲取應用快取的大小和清除快取的功能,我們知道我們應用當中經常會產生一些資料,比如圖片的快取,資料庫檔案,配置檔案等等。我們開發產品的時候,可能會有這樣的一個需求清除應用內快取的資料,可以讓使用者選擇刪除應用內產生的資料,這也是比較人性化的設計點。例如筆者參與開發的一款產品的設定介面就提供了清除快取的功能,如下圖所示:

在貼一大段程式碼之前,先普及Android的相關知識點:

先看360手機助手的一張圖:


從上面這張圖,我們可以看到這部手機有

系統檔案(注:這個是系統的檔案系統,不允許修改的)

內建SD卡(注:現在的手機基本上都有,就是我們所謂的ROM,是不可以移除的,RAM是我們手機的執行記憶體)

外接SD卡(注:這個就是我們的SD卡了,可以移除)

我們來考慮一個問題我們應用內的快取資料存放在哪裡?

我們的應用程式一般會產生以下幾種型別的資料:

file-普通的檔案儲存

database-資料庫檔案(.db檔案)

sharedPreference-配置資料(.xml檔案)

cache-圖片快取檔案

應用內資料的所有路徑:

/data/data/com.xxx.xxx/cache - 應用內快取(注:對應方法getCacheDir())

/data/data/com.xxx.xxx/databases - 應用內資料庫

/data/data/com.xxx.xxx/shared_prefs - 應用內配置檔案

/data/data/com.xxx.xxx/files - 應用內檔案(注:對應方法getFilesDir())

一種情況,我們沒有外接SD卡,那麼我們安裝的應用安裝在哪裡?自然是手機中的內建SD卡里,具體路徑是這樣的:


那在Android是用什麼方法來獲取這個路徑的:

如果我們手機有外接SD卡,我們也可以把應用安裝在SD卡,但移除SD卡之後就不能使用了。


不管是內建還是外接SD卡,獲取路徑的方法是一樣:

獲取SD卡根目錄:Environment.getExternalStorageDirectory().getAbsolutePath();

外部Cache路徑:/mnt/sdcard/android/data/com.xxx.xxx/cache 一般儲存快取資料(注:通過getExternalCacheDir()獲取)

外部File路徑:/mnt/sdcard/android/data/com.xxx.xxx/files 儲存長時間存在的資料 (注:通過getExternalFilesDir(String type)獲取, type為特定型別,可以是以下任何一種

Environment.DIRECTORY_MUSIC, Environment.DIRECTORY_PODCASTS, Environment.DIRECTORY_RINGTONES, Environment.DIRECTORY_ALARMS, Environment.DIRECTORY_NOTIFICATIONS, Environment.DIRECTORY_PICTURES, or Environment.DIRECTORY_MOVIES. )

最後提供一個工具類:

DataCleanManager.java

package com.infzm.daily.know.utils;

/*  * 文 件 名:  DataCleanManager.java  
 * * 描    述:  主要功能有清除內/外快取,清除資料庫,清除sharedPreference,清除files和清除自定義目錄  
 * */

import java.io.File;
import java.math.BigDecimal;

import android.content.Context;
import android.os.Environment;
import android.text.TextUtils;

/** * 本應用資料清除管理器 */
public class DataCleanManager {
	/**
	 * * 清除本應用內部快取(/data/data/com.xxx.xxx/cache) * *
	 * 
	 * @param context
	 */
	public static void cleanInternalCache(Context context) {
		deleteFilesByDirectory(context.getCacheDir());
	}

	/**
	 * * 清除本應用所有資料庫(/data/data/com.xxx.xxx/databases) * *
	 * 
	 * @param context
	 */
	public static void cleanDatabases(Context context) {
		deleteFilesByDirectory(new File("/data/data/"
				+ context.getPackageName() + "/databases"));
	}

	/**
	 * * 清除本應用SharedPreference(/data/data/com.xxx.xxx/shared_prefs) *
	 * 
	 * @param context
	 */
	public static void cleanSharedPreference(Context context) {
		deleteFilesByDirectory(new File("/data/data/"
				+ context.getPackageName() + "/shared_prefs"));
	}

	/**
	 * * 按名字清除本應用資料庫 * *
	 * 
	 * @param context
	 * @param dbName
	 */
	public static void cleanDatabaseByName(Context context, String dbName) {
		context.deleteDatabase(dbName);
	}

	/**
	 * * 清除/data/data/com.xxx.xxx/files下的內容 * *
	 * 
	 * @param context
	 */
	public static void cleanFiles(Context context) {
		deleteFilesByDirectory(context.getFilesDir());
	}

	/**
	 * * 清除外部cache下的內容(/mnt/sdcard/android/data/com.xxx.xxx/cache)
	 * 
	 * @param context
	 */
	public static void cleanExternalCache(Context context) {
		if (Environment.getExternalStorageState().equals(
				Environment.MEDIA_MOUNTED)) {
			deleteFilesByDirectory(context.getExternalCacheDir());
		}
	}
	/**
	 * * 清除自定義路徑下的檔案,使用需小心,請不要誤刪。而且只支援目錄下的檔案刪除 * *
	 * 
	 * @param filePath
	 * */
	public static void cleanCustomCache(String filePath) {
		deleteFilesByDirectory(new File(filePath));
	}

	/**
	 * * 清除本應用所有的資料 * *
	 * 
	 * @param context
	 * @param filepath
	 */
	public static void cleanApplicationData(Context context, String... filepath) {
		cleanInternalCache(context);
		cleanExternalCache(context);
		cleanDatabases(context);
		cleanSharedPreference(context);
		cleanFiles(context);
		if (filepath == null) {
			return;
		}
		for (String filePath : filepath) {
			cleanCustomCache(filePath);
		}
	}

	/**
	 * * 刪除方法 這裡只會刪除某個資料夾下的檔案,如果傳入的directory是個檔案,將不做處理 * *
	 * 
	 * @param directory
	 */
	private static void deleteFilesByDirectory(File directory) {
		if (directory != null && directory.exists() && directory.isDirectory()) {
			for (File item : directory.listFiles()) {
				item.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++) {
				// 如果下面還有檔案
				if (fileList[i].isDirectory()) {
					size = size + getFolderSize(fileList[i]);
				} else {
					size = size + fileList[i].length();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return size;
	}
	
	/**
	 * 刪除指定目錄下檔案及目錄
	 * 
	 * @param deleteThisPath
	 * @param filepath
	 * @return
	 */
	public static void deleteFolderFile(String filePath, boolean deleteThisPath) {
		if (!TextUtils.isEmpty(filePath)) {
			try {
				File file = new File(filePath);
				if (file.isDirectory()) {// 如果下面還有檔案
					File files[] = file.listFiles();
					for (int i = 0; i < files.length; i++) {
						deleteFolderFile(files[i].getAbsolutePath(), true);
					}
				}
				if (deleteThisPath) {
					if (!file.isDirectory()) {// 如果是檔案,刪除
						file.delete();
					} else {// 目錄
						if (file.listFiles().length == 0) {// 目錄下沒有檔案或者目錄,刪除
							file.delete();
						}
					}
				}
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 格式化單位
	 * 
	 * @param size
	 * @return
	 */
	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 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 String getCacheSize(File file) throws Exception {
		return getFormatSize(getFolderSize(file));
	}
	
}

相關推薦

Android記錄20-獲取快取大小清除快取功能

Android開發記錄20-獲取快取大小和清除快取功能轉載請註明:IT_xiao小巫 部落格地址:http://blog.csdn.net/wwj_748前言本篇部落格要給大家分享的如何獲取應用快取的大小和清除快取的功能,我們知道我們應用當中經常會產生一些資料,比如圖片的快取

Android Glide獲取快取大小清除快取

GlideCatchSimple SimpleDemo請看github Glide快取Simple 快取路徑的指定 快取大小的獲取 磁碟快取清除(兩種方法) 記憶體快取清除 可clone之後檢視使用Simple Glide cache Si

iOS 獲取快取大小清除快取

首先要獲取cache資料夾路徑 #define cachePath [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject] //

iOS獲取App快取檔案的大小清除快取

App在處理網路資源時,一般都會做離線快取處理,其中最典型離線快取框架為SDWebImage。 但是,離線快取會佔用一定的儲存空間,所以快取清理功能基本成為資訊、購物、閱讀類app的標配功能。 下面用程式碼來分別介紹快取檔案大小的獲取及清除快取

android獲取快取大小並清理快取

本文主要注重介紹實戰操作,理論知識可能介紹的不多,勿噴 簡單說兩句快取的好處: 採用快取,可以進一步大大緩解資料互動的壓力,又能提供一定的離線瀏覽。下邊我簡略列舉一下快取管理的適用環境: 1. 提供網路服務的應用 2. 資料更新不需要實時更新,哪怕是3-5分鐘的延遲

Android 開發 ContentProvider 獲取歌曲列表聯系人的樣例

mime類型 med rst file ins cas tracking ets oncreate ContentProvider(內容提供者)是Android中的四大組件之中的一個。主要用於對外共享數據。也就是通過ContentProvider把應用中的數據共享給其它

Android之Glide獲取圖片PathGlide獲取圖片Bitmap

今天主要研究了Glide獲取圖片Path、Bitmap用法,相信也困擾了大家很久,我在網上也找了很久,基本沒有,後來研究了下,也參考了下api文件,總結了以下幾個方式: 獲取Bitmap: 1)在圖片下載快取好之後獲取 Glide.with(mContext).load

android 開發過程中涉及到的清除快取操作

android 開發過程中會遇到很多快取,常常使人摸不清楚,這裡總結一下,希望下次遇到快取相關問題能有所幫助。 Clean Project 點選 Clean Project 會執行 clean、:

如何在 Notes 標準配置中重新建立工作空間清除快取

1. 使用DOS提示符,切換到Notes程式目錄。 2. 輸入以下內容來重新建立Eclispe工作空間:notes -RPARAMS -resetconfig 註釋:重新建立工作空間可以替換任何在安裝過程中損壞的Eclipse檔案。 3. 輸入以下內容來清除快取:notes -RPARAMS -clean

android上的一個網路介面圖片快取框架enif

1.底層網路介面採用apache的httpclient連線池框架; 2.圖片快取採用基於LRU的演算法; 3.網路介面採用監聽者模式; 4.包含圖片的OOM處理(及時回收處理技術的應用);   圖片核心處理類:CacheView.java [java] v

android開發如何獲取res/rawassets資料夾的路徑:

1.如果你只是拷貝動作,那麼你只需要得到res/raw和assets檔案輸入流就可以,方法如下:     獲取res/raw檔案輸入流:  InputStream is=getResources().

Android從Internet獲取圖片並儲存到快取

public class MainActivity extends AppCompatActivity { private Button button; private File file; private String path; private Handler hand

Android中Spanner獲取選中內容選中位置,根據位置選擇物件

作為一名菜鳥,關於spanner獲取選中的內容文字程式碼,網上後很多 但是根據給出的位置來自動選擇物件,這個程式碼一直沒找到 後來找人問了問,才知道就一句話的事,特意在這裡記錄下 array.xml

android開發中控制元件大小字型大小的選擇

1.dp:在控制元件邊距大小的選擇中選擇dp(density-independent pixel),這樣系統邊距就是畫素密度無關,在設定邊距、內邊距或者任何不打算按畫素值指定尺寸的情況下,通常都使用dp這種單位。 2.sp:scale-independent pixel,

android-studio如何獲取除錯版正式版sha1值

1.除錯版 首先,找到studio的terminal; 然後,找到jdk的bin目錄下,輸入命令:keytool -list -v  -keystore debug.keystore檔案路徑; 例如我的是keytool -list -v  -keystore C:\User

ImageLoader三級快取清除快取

public class ImageLoaderPicture {     private DisplayImageOptions options;     public ImageLoaderPicture(Context context) {         Image

Android實現側滑-新增資料toolbar等功能

首先是主程式碼塊 package alice.bw.com.day01zhoukao; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.Fra

16-golang的無快取channel快取channel

  我們先來看看無快取channel   func main() { var channel = make(chan int, 0) go func() { for i := 0; i <= 2; i++ {

Android從本地獲取照片以及呼叫手機拍照功能的方法

本文主要介紹的是從手機中獲取照片並且壓縮後顯示在imageview或者呼叫手機相機拍照之後壓縮顯示在imageView中,具有很好的參考意義,同時兼顧了Android7.0對於呼叫手機相機的設定問題。有需要的可以借鑑一下: 1.XML佈局檔案程式碼 <?xml ve

程序與記憶體6-快取記憶體1(每CPU頁框快取記憶體記憶體快取記憶體)

首先我提幾個主題: 磁碟快取記憶體、記憶體快取記憶體、硬體快取記憶體、每cpu頁框快取記憶體、頁快取記憶體、目錄項快取記憶體、索引節點快取記憶體、轉換後援緩衝器(TLB)、哈佛結構的快取記憶體、寫緩衝器、快取記憶體一致性、L1和L2等快取記憶體在驅動的使用。 上面這些就我