Intereting Posts
Скрыть TabLayout на прокрутке содержимого вместо ToolBar AlarmManager: как планировать ежедневную тревогу и обрабатывать изменения времени Whatsapp Message Layout – Как получить представление времени в той же строке Android: Как установить свойство пароля в текстовом редакторе? Что (?! A) {0}? Означает в регулярном выражении Java? Как я могу удалить щелчок кнопки SearchView? SoLoader $ WrongAbiError с React Native Android Проблема с коммутатором Java: выражения case должны быть постоянными выражениями Разрешить пользователю выбирать камеру или галерею для изображения Кнопка Fragment Butterknife не работает Android: используйте базу данных SQLite на SD-карте (вообще не используя встроенный Android-хранилище данных) Пользовательская обработка SSL перестала работать на Android 2.2 FroYo Анимация бота / дна представления нарушает прокрутку в recyclerView В отчетах Android Studio lint «невозможно определить типы аргументов». При нажатии кнопки «Дом» происходит разрушение Acivity.

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

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

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

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

Введите описание изображения здесь

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

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

Solutions Collecting From Web of "Когда очистить кеш-сервер в Android?"

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

кэш

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

файлы

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

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

Разница

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

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

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

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

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

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

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

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

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

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

Поместите этот код в 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(); } 

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

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

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

  • Некоторые приложения используют только отдельные сеансы и не нуждаются в запоминании каких-либо данных, поэтому вы можете очистить кеш, когда захотите (некоторые приложения даже делают это автоматически в своей активности 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 и сохраняют ваши настройки и историю поиска в кеше ==> данные карты зависят от приложения, настройки и история поиска зависят от пользователя

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