Решение для очистки каталога кэша изображений на SD-карте - PullRequest
3 голосов
/ 01 апреля 2010

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

В настоящее время я храню все эти изображения на SD-карте в пользовательском каталоге кэша (приложение Magnatune от ala evancharlton).

Я заметил, что примерно через 10 дней каталог составляет ~ 30 МБ. Это намного больше, чем я ожидал, и это наводит меня на мысль, что мне нужно найти хорошее решение для очистки старых файлов ... и я просто не могу придумать хорошего. Может быть, вы можете помочь. Вот те идеи, которые у меня были:

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

  2. После создания файлов на SD-карте позвоните new File("/path/to/file").deleteOnExit();. Это приведет к удалению всех файлов при выходе из виртуальной машины (я даже не знаю, работает ли этот метод на Android). Это приемлемо, потому что, хотя файлы должны быть кэшированы для сеанса, они не должны кэшироваться для следующего сеанса. Похоже, что это также замедлит работу устройства, если при выходе из виртуальной машины будет удалено много файлов.

  3. Удалить старые файлы, до максимального количества файлов. То же, что № 1, но одновременно удаляется только N файлов. Мне не очень нравится эта идея, и если пользователь был очень активным, он никогда не сможет наверстать упущенное и поддерживать каталог кэша в чистоте.

Это все, что у меня есть. Любые предложения будут оценены.

1 Ответ

2 голосов
/ 01 апреля 2010
  1. Не удаляйте их все сразу. Удаляйте одну каждые несколько секунд или что-то, и пользователь может не заметить.
  2. Виртуальная машина не работает нормально на Android, поэтому deleteOnExit() не будет надежным.
  3. См. № 1 выше.

Вы также можете использовать AlarmManager, чтобы запланировать работу по удалению в первые утренние часы. Это имеет побочное преимущество ограниченного попадания в процессор - все, что действительно работает в фоновом режиме, ограничено до ~ 10% процессорного времени, поэтому эта работа не повлияет на пользователя, даже если пользователь фактически использует устройство в этот час. Вам нужно будет использовать WakeLock, чтобы держать устройство в активном состоянии во время удаления объектов. Для этого можно использовать мой WakefulIntentService, так как это решает проблему поддержания устройства в активном состоянии и удаления его из основного потока приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...