Cache in Android-Anwendung programmgesteuert löschen

75

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();
}

Bild von meinem Android-Handy

Rizwan Ahmed
quelle
2
Überprüfen Sie auch getExternalCacheDir ()
Patrick Favre
@ for3st können wir den Cache nur für die Webansicht leeren?
Rizwan Ahmed
2
WebView.clearCache (boolean includeDiskFiles) löscht den Cache aller Webvies in der Anwendung
Patrick Favre
Mögliches Duplikat von Wie man den Cache
löscht
@ RizwanAhmed hast du die Lösung für das obige Problem gefunden
Vishwa Pratap

Antworten:

141

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;
    }
}
Dharam
quelle
Bei dieser Aktion, bei der Sie Ihren Anwendungscache löschen möchten. Vielleicht kann es in OnDestroy oder irgendwo in Ihrer App sein, dies zu tun
Dharam
1
Dieser Code löscht niemals Dateien. Wenn dir.isDirectory () == false ist, wird einfach false zurückgegeben. Da Sie nicht leere Verzeichnisse nicht löschen können, funktioniert dies nicht. Sie sollten ein anderes hinzufügen: if (dir != null && dir.isDirectory()) { ... } else if(dir.isFile()) { return dir.delete(); }
Pierfrancesco Soffritti
@dhams löscht diese Methode auch meine gemeinsamen Präferenzdaten? weil ich das behalten und nur Bilder im Cache löschen möchte !!!
Saty
3
@ Saty: Nein, dies löscht nicht die gemeinsamen Einstellungen
Taifun
1
Sie schreiben in die Dokumentation, für die wir keine zusätzlichen Berechtigungen benötigen. "Apps benötigen keine zusätzlichen Berechtigungen zum Lesen oder Schreiben in den zurückgegebenen Pfad, da dieser Pfad in ihrem privaten Speicher gespeichert ist." developer.android.com/reference/android/content/…
YTerle
57

Kotlin hat einen Einzeiler

context.cacheDir.deleteRecursively()
Fintasys
quelle
8
Perfekte Antwort, dies sollte auch in Java verfügbar sein als: context.getCacheDir (). DeleteRecursively ()
JJ Du Plessis
15

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.gradleDatei im folgenden dependenciesTeil hinzu:

compile 'commons-io:commons-io:2.4'
Eirik W.
quelle
2
Die Kompilierungszeile in der Gradle-Datei lautet jetzt 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-io
Juan Ignacio Avendaño Huergo
5

Ich denke du solltest clearApplicationData()vor dem platzierensuper.OnDestroy().

Ihre App kann keine Methoden verarbeiten, wenn sie heruntergefahren wurde.

Dennie
quelle
3
von wo ich fand diese Methode
Eminent
1
Grundlegender Lebenszyklus für Android-Aktivitäten. Lesen Sie dies am besten, bevor Sie fortfahren. developer.android.com/guide/components/activities/… Oder meinst du clearApplicationData ()? Das OP hat das selbst geschrieben.
Dennie
2

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 ()

Javid
quelle
Von Nur-Code-Antworten wird abgeraten, da sie nicht erklären, wie sie das Problem lösen. Bitte aktualisieren Sie Ihre Antwort, um zu erklären, wie sich dies gegenüber den anderen akzeptierten und positiv bewerteten Antworten verbessert, die diese Frage bereits hat, und um die mehreren Instanzen ungültigen Textes im Code zu entfernen ("Code hier eingeben"). Bitte überprüfen Sie, wie ich eine gute Antwort schreibe .
FluffyKitten
2

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();
}
Marcos Roberto Nunes Lindolpho
quelle
Wie kann ich Ihren Code verwenden und nur den Cache shared_prefs löschen?
Kannst
1

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;
        }
    }
}
Dyno Cris
quelle
-1

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;
        }
Gyan Swaroop Awasthi
quelle
Ich denke, dies löscht auch die Daten, nicht nur den Cache.
Hamza Khan
Dadurch werden auch die App-Daten gelöscht, anstatt nur den Cache zu leeren. Diese clearApplicationUserData () - API sollte nicht nur zum Löschen des Caches verwendet werden.
Rajeev Jayaswal