以编程方式在Android应用中清除缓存

Riz*_*med 57 android

什么是以编程方式清除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();
}
Run Code Online (Sandbox Code Playgroud)

来自我的Android手机的图片

dha*_*ram 109

如果您正在寻找自己的应用程序的删除缓存,那么只需删除您的缓存目录,并完成所有操作!

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 此代码从不删除文件。当 dir.isDirectory() == false 时,它​​只返回 false。由于您无法删除非空目录,因此这将不起作用。你应该添加一个 else: `if (dir != null &amp;&amp; dir.isDirectory()) { ... }` `else if(dir.isFile()) { return dir.delete(); }` (2认同)
  • @Saty:不,这不清除共享首选项 (2认同)

Fin*_*sys 26

Kotlin有一个单行

context.cacheDir.deleteRecursively()
Run Code Online (Sandbox Code Playgroud)

  • 完美的答案,这也应该在 Java 中可用:context.getCacheDir().deleteRecursively() (8认同)

Eir*_*k W 12

dhams的答案是正确的(经过多次编辑后),但是由于代码的许多编辑显示,很难自己编写用于删除目录(带子目录)的正确且健壮的代码.所以我强烈建议使用Apache Commons IO或其他一些为您执行此操作的API:

import org.apache.commons.io.FileUtils;

...

// Delete local cache dir (ignoring any errors):
FileUtils.deleteQuietly(context.getCacheDir());
Run Code Online (Sandbox Code Playgroud)

PS:如果你使用它,也删除context.getExternalCacheDir()返回的目录.

为了能够使用Apache Commons IO,请将其添加到您的build.gradle文件中,dependencies部分内容如下:

compile 'commons-io:commons-io:2.4'
Run Code Online (Sandbox Code Playgroud)

  • gradle文件中的编译行现在将是“ implementation'commons-io:commons-io:2.5'”。我首先尝试了2.6,但是我遇到了一些错误,例如noSuchMethodException,所以现在请使用2.5版本。此处的最新版本:mvnrepository.com/artifact/commons-io/commons-io (2认同)

Cip*_*ian 6

如果您使用 kotlin,那么:

context.cacheDir.deleteRecursively()
Run Code Online (Sandbox Code Playgroud)


Den*_*nie 5

我想你应该到位clearApplicationData()之前,super.OnDestroy().

您的应用程序在关闭后无法处理任何方法。

  • 我从哪里找到这个方法 (3认同)