Как узнать размер кеша в Android
Я использую реализацию ленивого списка загрузки Федора в своем тестовом приложении, где я могу очистить кеш одним нажатием кнопки. Как я могу получить размер кеша загруженных изображений в списке и очистить кеш программно?
Вот код для сохранения кэшированных изображений:
public ImageLoader(Context context){
//Make the background thead low priority. This way it will not affect the UI performance.
photoLoaderThread.setPriority(Thread.NORM_PRIORITY-1);
mAssetManager = context.getAssets();
//Find the dir to save cached images
if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
cacheDir = new File(android.os.Environment.getExternalStorageDirectory(),"LazyList");
else
cacheDir = context.getCacheDir();
if(!cacheDir.exists())
cacheDir.mkdirs();
}
РЕДАКТИРОВАТЬ:
Поэтому в основном я добавил этот фрагмент кода в метод clearCache(), но я все еще не вижу, чтобы изображения снова загружались при прокрутке.
public void clearCache() {
//clear memory cache
long size=0;
cache.clear();
//clear SD cache
File[] files = cacheDir.listFiles();
for (File f:files) {
size = size+f.length();
if(size >= 200)
f.delete();
}
}
4 ответа
Решение
Чтобы узнать размер каталога кеша используйте код, приведенный ниже.
public void clearCache() {
//clear memory cache
long size = 0;
cache.clear();
//clear SD cache
File[] files = cacheDir.listFiles();
for (File f:files) {
size = size+f.length();
f.delete();
}
}
Это вернет количество байтов.
Это было более точным для меня:
private void initializeCache() {
long size = 0;
size += getDirSize(this.getCacheDir());
size += getDirSize(this.getExternalCacheDir());
}
public long getDirSize(File dir){
long size = 0;
for (File file : dir.listFiles()) {
if (file != null && file.isDirectory()) {
size += getDirSize(file);
} else if (file != null && file.isFile()) {
size += file.length();
}
}
return size;
}
В Котлине вы можете использовать:
context.cacheDir.walkBottomUp().fold(0L, { acc, file -> acc + file.length() })
или определите его как функцию расширения
fun File.calculateSizeRecursively(): Long {
return walkBottomUp().fold(0L, { acc, file -> acc + file.length() })
}
// usage
val size = context.cacheDir.calculateSizeRecursively()
... и очистить кеш, просто удалите каталог и создайте новый пустой.