以编程方式清除 Android 应用程序中的缓存
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/23908189/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Clear Cache in Android Application programmatically
提问by Rizwan Ahmed
what is the correct way to clear cache in android Application programmatically. I already using following code but its not look work for me
以编程方式清除android应用程序中缓存的正确方法是什么。我已经在使用以下代码,但它看起来对我不起作用
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
clearApplicationData();
}
public void clearApplicationData() {
File cache = getCacheDir();
File appDir = new File(cache.getParent());
if (appDir.exists()) {
String[] children = appDir.list();
for (String s : children) {
if (!s.equals("lib")) {
deleteDir(new File(appDir, s));
Log.i("EEEEEERRRRRRROOOOOOORRRR", "**************** File /data/data/APP_PACKAGE/" + s + " DELETED *******************");
}
}
}
}
public 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();
}
回答by dharam
If you are looking for delete cache of your own application then simply delete your cache directory and its all done !
如果您正在寻找自己应用程序的删除缓存,那么只需删除您的缓存目录即可!
public static void deleteCache(Context context) {
try {
File dir = context.getCacheDir();
deleteDir(dir);
} catch (Exception e) { e.printStackTrace();}
}
public 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();
} else if(dir!= null && dir.isFile()) {
return dir.delete();
} else {
return false;
}
}
回答by Fintasys
Kotlin has an one-liner
Kotlin 有一个单行
context.cacheDir.deleteRecursively()
回答by Eirik W
The answer from dhams is correct (after having been edited several times), but as the many edits of the code shows, it is difficult to write correct and robust code for deleting a directory (with sub-dirs) yourself. So I strongly suggest using Apache Commons IO, or some other API that does this for you:
dhams 的答案是正确的(经过多次编辑后),但是正如代码的许多编辑所示,很难自己编写正确且健壮的代码来删除目录(带有子目录)。因此,我强烈建议使用Apache Commons IO或其他一些为您执行此操作的 API:
import org.apache.commons.io.FileUtils;
...
// Delete local cache dir (ignoring any errors):
FileUtils.deleteQuietly(context.getCacheDir());
PS: Also delete the directory returned by context.getExternalCacheDir() if you use that.
PS:如果使用,也删除 context.getExternalCacheDir() 返回的目录。
To be able to use Apache Commons IO, add this to your build.gradle
file, in the dependencies
part:
为了能够使用 Apache Commons IO,请将其添加到您的build.gradle
文件中dependencies
:
compile 'commons-io:commons-io:2.4'
回答by Dennie
I think you're supposed to place clearApplicationData()
before the super.OnDestroy().
我想你应该到位clearApplicationData()
之前,super.OnDestroy().
Your app can't process any methods when it has been shut down.
您的应用程序在关闭后无法处理任何方法。
回答by Javid
I am not sure but I sow this code too. this cod will work faster and in my mind its simple too. just get your apps cache directory and delete all files in directory
我不确定,但我也播下了这段代码。这种鳕鱼会更快地工作,在我看来它也很简单。只需获取您的应用程序缓存目录并删除目录中的所有文件
public boolean clearCache() {
try {
// create an array object of File type for referencing of cache files
File[] files = getBaseContext().getCacheDir().listFiles();
// use a for etch loop to delete files one by one
for (File file : files) {
/* you can use just [ file.delete() ] function of class File
* or use if for being sure if file deleted
* here if file dose not delete returns false and condition will
* will be true and it ends operation of function by return
* false then we will find that all files are not delete
*/
if (!file.delete()) {
return false; // not success
}
}
// if for loop completes and process not ended it returns true
return true; // success of deleting files
} catch (Exception e) {}
// try stops deleting cache files
return false; // not success
}
It gets all of cache files in File array by getBaseContext().getCacheDir().listFiles() and then deletes one by one in a loop by file.delet() method
它通过 getBaseContext().getCacheDir().listFiles() 获取 File 数组中的所有缓存文件,然后通过 file.delet() 方法循环删除
回答by Marcos Roberto Nunes Lindolpho
Try this
尝试这个
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
clearApplicationData();
}
public void clearApplicationData() {
File cache = getCacheDir();
File appDir = new File(cache.getParent());
if (appDir.exists()) {
String[] children = appDir.list();
for (String s : children) {
if (!s.equals("lib")) {
deleteDir(new File(appDir, s));
Log.i("EEEEEERRRRRROOOOOOORRRR", "**************** File /data/data/APP_PACKAGE/" + s + " DELETED *******************");
}
}
}
}
public static boolean deleteDir(File dir) {
if (dir != null && dir.isDirectory()) {
String[] children = dir.list();
int i = 0;
while (i < children.length) {
boolean success = deleteDir(new File(dir, children[i]));
if (!success) {
return false;
}
i++;
}
}
assert dir != null;
return dir.delete();
}
回答by Dyno Cris
Put this code in onStop()
method of MainActivity
把这段代码放在onStop()
方法中MainActivity
@Override
protected void onStop() {
super.onStop();
AppUtils.deleteCache(getApplicationContext());
}
public class AppUtils {
public static void deleteCache(Context context) {
try {
File dir = context.getCacheDir();
deleteDir(dir);
} catch (Exception e) {}
}
public 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();
} else if(dir!= null && dir.isFile()) {
return dir.delete();
} else {
return false;
}
}
}