Was ist der richtige Weg, um den Cache in der Android-Anwendung programmgesteuert zu löschen? Ich verwende bereits folgenden Code, aber es sieht für mich nicht gut aus
@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();
}
Antworten:
Wenn Sie nach einem Cache zum Löschen Ihrer eigenen Anwendung suchen, löschen Sie einfach Ihr Cache-Verzeichnis und fertig!
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; } }
quelle
if (dir != null && dir.isDirectory()) { ... }
else if(dir.isFile()) { return dir.delete(); }
Kotlin hat einen Einzeiler
context.cacheDir.deleteRecursively()
quelle
Die Antwort von dhams ist korrekt (nachdem sie mehrmals bearbeitet wurde), aber wie die vielen Änderungen des Codes zeigen, ist es schwierig, selbst korrekten und robusten Code zum Löschen eines Verzeichnisses (mit Unterverzeichnissen) zu schreiben. Ich empfehle daher dringend, Apache Commons IO oder eine andere API zu verwenden, die dies für Sie erledigt:
import org.apache.commons.io.FileUtils; ... // Delete local cache dir (ignoring any errors): FileUtils.deleteQuietly(context.getCacheDir());
PS: Löschen Sie auch das von context.getExternalCacheDir () zurückgegebene Verzeichnis, wenn Sie das verwenden.
Um Apache Commons IO verwenden zu können, fügen Sie dies Ihrer
build.gradle
Datei im folgendendependencies
Teil hinzu:compile 'commons-io:commons-io:2.4'
quelle
implementation 'commons-io:commons-io:2.5'
. Ich habe zuerst 2.6 ausprobiert, aber ich habe einen Fehler wie noSuchMethodException. Verwenden Sie jetzt bitte nur Version 2.5. Neueste Versionen hier: mvnrepository.com/artifact/commons-io/commons-ioIch denke du solltest
clearApplicationData()
vor dem platzierensuper.OnDestroy().
Ihre App kann keine Methoden verarbeiten, wenn sie heruntergefahren wurde.
quelle
Ich bin mir nicht sicher, aber ich säe auch diesen Code. Dieser Kabeljau wird schneller arbeiten und in meinen Augen ist es auch einfach. Holen Sie sich einfach das Cache-Verzeichnis Ihrer Apps und löschen Sie alle Dateien im Verzeichnis
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 }
Es ruft alle Cache-Dateien im Datei-Array mit getBaseContext (). GetCacheDir (). ListFiles () ab und löscht sie dann einzeln in einer Schleife mit der Methode file.delet ()
quelle
Versuche dies
@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(); }
quelle
Geben Sie diesen Code in die
onStop()
Methode von einMainActivity
@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; } } }
quelle
Dieser Code entfernt Ihren gesamten Cache der Anwendung. Sie können die App-Einstellungen überprüfen, die App-Informationen öffnen und die Größe des Caches überprüfen. Sobald Sie diesen Code verwenden, beträgt Ihre Cache-Größe 0 KB. Also es und genieße den sauberen Cache.
if (Build.VERSION_CODES.KITKAT <= Build.VERSION.SDK_INT) { ((ActivityManager) context.getSystemService(ACTIVITY_SERVICE)) .clearApplicationUserData(); return; }
quelle