項目中碰到了計算緩存大小和清空緩存的功能,這個很常見的功能,幾乎每個APP都有,以爲實現很簡單,網上搜了一大堆,發現都不是符合我需要的,而且經常刪除的沒有效果,於是又另外找了一些資料,折騰了蠻久,終於完成了
以下的這個類的功能很簡單,計算你的緩存總大小,不管內部緩存還是外部緩存,和清空緩存,包括內部和外部的緩存一起清空,請本人親測,效果槓槓的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
public
class
DataCleanManager { public
static
String getTotalCacheSize(Context context) throws
Exception { long
cacheSize = getFolderSize(context.getCacheDir()); if
(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
cacheSize
+= getFolderSize(context.getExternalCacheDir()); }
return
getFormatSize(cacheSize); } public
static
void
clearAllCache(Context context) { deleteDir(context.getCacheDir()); if
(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
deleteDir(context.getExternalCacheDir()); }
} 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++) { //
如果下面還有文件 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
"0K" ; }
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" ;
}
} |
當你在項目中需要查下緩存大小,就使用getTotalCacheSize(Context)方法,清空緩存,就使用clearAllCache(Context)方法
之前在網上查了很多別人寫的方法,查詢可以用,當清空往往是無效的,這個無效的方法如下:
1
2
3
4
5
6
7
|
private
static
void
deleteFilesByDirectory(File directory) { if
(directory != null
&& directory.exists() && directory.isDirectory()) { for
(File item : directory.listFiles()) { item.delete();
}
}
} |
應該是directory的問題,相關的鏈接在此