Подтвердить что ты не робот

Когда очистить кеш-диск в Android?

У меня есть приложение, которое отображает изображения из Интернета (витрина для работы дизайнера). Я начал кэшировать свой контент во внутреннем каталоге кеша, но содержание приложения может занимать около 150 МБ в размере кеша. И какие документы для android говорят:

Вы всегда должны хранить файлы кеша самостоятельно и оставаться в пределах разумный предел потребляемого пространства, например 1 МБ. Когда пользователь удаляет ваше приложение, эти файлы удаляются.

Итак, я взглянул на приложение Currents (Galaxy Nexus), а размер кэша для приложения - 110 МБ. Но что странно, что приложения, такие как Google Currents и Google Maps, кэшируют содержимое в названии (данные USB-хранилища):

enter image description here

Итак, что это за "данные хранения USB", которые использует предыдущее приложение. И если вы реализуете кэширование в своем приложении, вы перебираете все ваши файлы приложений в кеше, чтобы получать размер каждый раз, когда вам нужно что-то вставлять, а затем сравнивать и очищать его? Или вы продолжаете кэшировать контент до тех пор, пока Android не решит потратить время на очистку каталога приложений?

Мне очень интересно узнать, каков поток управления кешем в Android, или, по крайней мере, то, что другие приложения делают с большим контентом для кеширования.

4b9b3361

Ответ 1

Прежде чем перейти к вашему вопросу, кратко поясним два типа хранилищ:

Кэш

Это папка, специфичная для приложения в файловой системе. Цель этого каталога - хранить временные данные, которые могут потребоваться вашим приложением для сеансов между сеансами, но не обязательно иметь их навсегда. Обычно вы обращаетесь к этому каталогу с Context.getCacheDir(). Это будет отображаться как "Кэш" в настройках вашего приложения.

Файлы

Как и кэш-папка, ваше приложение также имеет каталог приложений для хранения файлов. Файлы в этом каталоге будут существовать до тех пор, пока приложение явно не удалит их или приложение не будет удалено. Обычно вы обращаетесь к этому каталогу с помощью Context.getFilesDir(). Это может отображаться как различные вещи на экране информации о приложении, но на вашем снимке экрана это "Данные хранения USB".

ПРИМЕЧАНИЕ. Если вы хотите явно разместить на внешнем носителе (обычно SD-карту), вы можете использовать Context.getExternalFilesDir(String type). p >

Разница

Оба каталога специфичны только для вашего приложения (другие приложения не имеют доступа). Одна из отличий между каталогом кеша и файлов заключается в том, что если система становится меньше на хранилище, первое место, которое она собирается освобождать ресурсы, принадлежит вашему каталогу кэша. Система не очистит данные из каталога файлов. Другое отличие состоит в том, что каталог кеша обычно можно очистить вручную с экрана информации о приложении. Обычно каталог файлов также может работать, но очистка каталога файлов также очищает каталог кэша.

Какой из них я использую?

Это зависит от того, насколько важны данные, сопоставляемые с временем жизни вашего приложения. Если вам нужны только данные за один сеанс, и вы сомневаетесь, что вам когда-нибудь понадобится использовать эти данные снова, тогда не используйте их. Просто держите его в памяти, пока он вам не понадобится. Если вы подозреваете, что вам нужно будет повторно использовать данные между несколькими сеансами, но вам не нужно хранить бумажную копию, используйте каталог кеша. Если вы должны иметь эти данные независимо от того, что, или если это довольно большие данные, которые требуют постоянного хранения, используйте каталог файлов. Вот несколько примеров, о которых я могу думать:

  • Кэш - недавно открытая электронная почта
    • После открытия кешируйте данные, поэтому, когда пользователь хочет снова прочитать это электронное письмо, он загружает мгновенно, вместо того чтобы снова использовать сеть для получения тех же данных. Мне не нужно держать это навсегда, потому что в конечном итоге пользователь будет закончен по электронной почте.
  • Файлы - приложение, загруженное из электронной почты
    • Это действие пользователя, который говорит "Я хочу сохранить эти данные, чтобы я мог восстановить его, когда мне это нужно". Поэтому поместите его в каталог файлов, поскольку я никогда не хочу удалять этот файл, пока пользователь не захочет его удалить.

Когда мне нужно очистить каталог кэша?

Из Context.getCacheDir() javadocs:

Примечание. Вы не должны полагаться на систему, удаляющую эти файлы для вас; вы должны всегда иметь разумный максимум, например 1 МБ, для количество пространства, которое вы потребляете с кеш файлами, и обрезать эти файлы при превышении этого пространства.

Он использует пример 1 МБ, но может быть или не быть разумным для вашего приложения. Несмотря на это, вам нужно установить жесткий максимум. Причина этого сводится к разработке ответственного приложения. Итак, когда вы должны проверить? Я бы рекомендовал проверять каждый раз, когда вы хотите поместить что-то в каталог кеша. Здесь очень простой менеджер кэшей:

public class CacheManager {

    private static final long MAX_SIZE = 5242880L; // 5MB

    private CacheManager() {

    }

    public static void cacheData(Context context, byte[] data, String name) throws IOException {

        File cacheDir = context.getCacheDir();
        long size = getDirSize(cacheDir);
        long newSize = data.length + size;

        if (newSize > MAX_SIZE) {
            cleanDir(cacheDir, newSize - MAX_SIZE);
        }

        File file = new File(cacheDir, name);
        FileOutputStream os = new FileOutputStream(file);
        try {
            os.write(data);
        }
        finally {
            os.flush();
            os.close();
        }
    }

    public static byte[] retrieveData(Context context, String name) throws IOException {

        File cacheDir = context.getCacheDir();
        File file = new File(cacheDir, name);

        if (!file.exists()) {
            // Data doesn't exist
            return null;
        }

        byte[] data = new byte[(int) file.length()];
        FileInputStream is = new FileInputStream(file);
        try {
            is.read(data);
        }
        finally {
            is.close();
        }

        return data;
    }

    private static void cleanDir(File dir, long bytes) {

        long bytesDeleted = 0;
        File[] files = dir.listFiles();

        for (File file : files) {
            bytesDeleted += file.length();
            file.delete();

            if (bytesDeleted >= bytes) {
                break;
            }
        }
    }

    private static long getDirSize(File dir) {

        long size = 0;
        File[] files = dir.listFiles();

        for (File file : files) {
            if (file.isFile()) {
                size += file.length();
            }
        }

        return size;
    }
}

Конечно, это может быть дорогостоящая операция, поэтому вам следует планировать кэширование в фоновом потоке.

Кроме того, это может быть так сложно, как вам нужно. В моем примере я предполагаю, что все кэшированные файлы размещены в корне каталога кэша, поэтому я не проверяю потенциальные подкаталоги. Процедура удаления файлов также может стать более сложной, например, удаление файлов по самой старой дате доступа.

Одна вещь, которую следует иметь в виду при принятии решения о кешировании данных, заключается в том, что вам всегда нужно планировать, чтобы ваши кешированные данные больше не существовали. Всегда выполняйте рутину для извлечения данных по внешним средствам, когда ваш кеш не имеет ее в хранилище. Аналогично, всегда проверяйте свой кеш, прежде чем извлекать данные извне. Целью кеша является сокращение активности сети, длительных процессов и обеспечение гибкого пользовательского интерфейса в вашем приложении. Поэтому используйте его ответственно:)

Ответ 2

i лучший способ очистить кэш приложения при завершении работы, чтобы каждый таймер кеша очищался при вызове новой активности.

поместите этот код в onDestroy() для чистого кэша приложений

@Override
protected void onDestroy() {

    super.onDestroy();
    try {
        trimCache(this);
       // Toast.makeText(this,"onDestroy " ,Toast.LENGTH_LONG).show();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public static void trimCache(Context context) {
    try {
       File dir = context.getCacheDir();
       if (dir != null && dir.isDirectory()) {
          deleteDir(dir);
       }
    } catch (Exception e) {
       // TODO: handle exception
    }
 }

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;
          }
       }
    }
    // The directory is now empty so delete it
    return dir.delete();
}

Ответ 3

Я думаю, что идея, лежащая в основе кеша, состоит в том, чтобы написать все, что вы хотите, и Android будет управлять своим размером, если он станет слишком высоким.

Вы должны иметь в виду, что вы можете записывать файлы в кеш, но всегда проверяет, сохраняется ли файл при попытке получить к нему доступ. И пусть андроид управляет кэшем.

Ответ 4

В зависимости от типа приложения:

  • Некоторые приложения используют только отдельные сеансы и не нуждаются в запоминании каких-либо данных, поэтому вы можете очистить кеш, когда захотите (некоторые приложения даже делают это автоматически в своей активности onStop)
  • Большинство приложений хранят ваши данные, потому что они помнят ваши настройки, учетную запись, которую вы использовали для входа в систему,... В этом случае лучше всего очистить кеш, если вы не используете приложение много.

также:

So i took a look at Chrome app (Galaxy Nexus) and the cache size for the application is 110 MB. But what wired is that applications like Google current & Google maps cache the content in something called (USB Storage Data) :

AFAIK, данные хранилища Usb отличаются от кеша: хранилище предназначено для хранения информации о конкретной программе (например, карты для приложения GPS), кеш используется для хранения пользовательской информации (например, для входа в систему)

В случае карт google: я предполагаю, что они хранят данные карты в хранилище usb и сохраняют ваши настройки и историю поиска в кеше == > данные карты зависят от приложения, настройки и история поиска зависят от пользователя

Ответ 5

В соответствии с документацией система очистит кеш, когда устройство находится на низком внутреннем хранилище. Поскольку API8 у вас есть метод getExternalCacheDir(), который, как мне кажется, полезен, так как я читаю, у вас может быть около 150 МБ данных, но недостаток внешнего кеша - это то, что вам придется самостоятельно очистить каталог кэша, если он станет слишком большим.