Очистити кеш у програмі Android програмно


76

який правильний спосіб програмно очистити кеш-пам’ять в програмі 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();
}

Зображення з мого телефону Android


2
також перевірити getExternalCacheDir ()
Патрік Фавр

@ for3st чи можемо ми очистити кеш лише для веб-перегляду?
Різван Ахмед,

2
WebView.clearCache (boolean includeDiskFiles) очистить кеш усіх веб-фільмів у програмі
Патрік Фавр,

Можливий дублікат Як очистити кеш-пам'ять Android
Yksh

@RizwanAhmed не знайшов рішення вищезазначеної проблеми
Вішва Пратап,

Відповіді:


143

Якщо ви шукаєте для видалення кеш-пам’яті власний додаток, просто видаліть каталог кешу та все зроблено!

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

На цій дії, де ви хочете видалити кеш програми. можливо це можна зробити в OnDestroy або десь у вашому додатку, щоб зробити це
dharam

1
цей код ніколи не видаляє файли. Коли dir.isDirectory () == false, він просто повертає false. Оскільки ви не можете видалити не пустий каталог, це не буде працювати. Ви повинні додати ще одне: if (dir != null && dir.isDirectory()) { ... } else if(dir.isFile()) { return dir.delete(); }
Pierfrancesco Soffritti

@dhams чи також цей метод також очищає мої спільні дані налаштувань? тому що я хочу зберегти це і очистити лише зображення в кеші !!!
Саті

3
@Saty: ні, це не очищає спільні уподобання
Тайфун

1
Вони пишуть в документації, для цього нам не потрібні додаткові дозволи. "Додатки не вимагають додаткових дозволів на читання або запис у повернутий шлях, оскільки цей шлях живе у їх приватному сховищі." developer.android.com/reference/android/content/…
YTerle

61

Котлін має однокласний вкладиш

context.cacheDir.deleteRecursively()

8
Прекрасна відповідь, це повинно бути доступно і на Java як: context.getCacheDir (). DeleteRecursively ()
JJ Du Plessis

16

Відповідь від dhams є правильною (після того, як її кілька разів редагували), але, як показує безліч редагувань коду, важко написати правильний і надійний код для видалення каталогу (з підкаталогами) самостійно. Тому я настійно рекомендую використовувати Apache Commons IO або будь-який інший API, який робить це за вас:

import org.apache.commons.io.FileUtils;

...

// Delete local cache dir (ignoring any errors):
FileUtils.deleteQuietly(context.getCacheDir());

PS: Також видаліть каталог, який повертає context.getExternalCacheDir (), якщо ви використовуєте це.

Щоб мати можливість використовувати Apache Commons IO, додайте це у свій build.gradleфайл, у dependenciesчастині:

compile 'commons-io:commons-io:2.4'

2
Рядок компіляції у файлі gradle тепер буде implementation 'commons-io:commons-io:2.5'. Спочатку я спробував 2.6, але у мене виникла помилка, як-от noSuchMethodException, тому, будь ласка, зараз використовуйте версію 2.5. Останні версії тут: mvnrepository.com/artifact/commons-io/commons-io
Хуан Ігнасіо Авеняньо Уерго,

5

Я думаю, що ви повинні розмістити clearApplicationData()доsuper.OnDestroy().

Ваш додаток не може обробляти жодні методи, коли його було вимкнено.


3
звідки я знайшов цей метод
EminenT

1
Основний життєвий цикл активності Android. Найкраще прочитати це перед тим, як продовжувати. developer.android.com/guide/components/activities/… Або ви маєте на увазі clearApplicationData ()? ОП написав це сам.
Денні

2

Я не впевнений, але я теж сію цей код. ця тріска буде працювати швидше, і на мою думку вона теж проста. просто дістаньте каталог кешу програм і видаліть усі файли в каталозі

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 
}

Він отримує всі файли кешу в масиві файлів методом getBaseContext (). GetCacheDir (). ListFiles (), а потім видаляє один за одним у циклі методом file.delet ()


Відповіді лише на код не рекомендується, оскільки вони не пояснюють, як вони вирішують проблему. Будь ласка, оновіть свою відповідь, щоб пояснити, як це покращує інші прийняті та схвалені відповіді, які вже є в цьому питанні, а також видалити численні випадки недійсного тексту в коді ("введіть код тут"). Будь ласка, перегляньте Як написати хорошу відповідь .
FluffyKitten

2

Спробуйте це

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

Як я можу використовувати ur-код і видалити лише кеш shared_prefs? чи можете ви мені допомогти ...
Каран Ісрані

1

Помістіть цей код у 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;
        }
    }
}

-1

Цей код видалить весь кеш програми. Ви можете перевірити налаштування програми та відкрити інформацію про програму та перевірити розмір кешу. Після використання цього коду розмір кешу складе 0 КБ. Тож насолоджуйтесь чистим кешем.

 if (Build.VERSION_CODES.KITKAT <= Build.VERSION.SDK_INT) {
            ((ActivityManager) context.getSystemService(ACTIVITY_SERVICE))
                    .clearApplicationUserData();
            return;
        }

я думаю, що це також очищає дані, а не лише кеш.
хамза-хан

Це також видалить дані програми, замість того, щоб очистити лише кеш. Цей api clearApplicationUserData () не слід використовувати для простого очищення кешу.
Rajeev Jayaswal
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.