Мне интересно, есть ли у кого-нибудь опыт в архитектуре, которая предназначена для кэширования максимально возможного количества изображений, динамически обнаруживаемых.
В моей ситуации я запрашиваю растровое изображение для каждого элемента, щелкнувшего из ListView.Эти битовые карты принимаются через сеть (недешевая операция с точки зрения обработки или сетевого ввода-вывода).Пользователь, вероятно, загрузит несколько элементов из списка, переключаясь между ними.Я кэширую эти изображения так, чтобы последующие запросы элемента приводили к мгновенной загрузке растрового изображения:
private Bitmap bitmap = null;
public Bitmap getBitmap(int id) {
if(bitmap == null) bitmap = expensiveNetworkOperationToGetBitmap(id);
return bitmap;
}
(пожалуйста, игнорируйте проблемы блокировки потоков)
ОднакоВполне возможно, что пользователь будет просматривать многие элементы.Каждый из них медленно занимал часть памяти, в конечном итоге перебирал бюджет и ломал приложение.
Что заставляет меня задать вопрос: Можно ли динамически определять, когда ваше кэширование достигает предела? Если это так, то можно начинать уничтожать старые изображения по мере добавления новыхиз них.Ниже приведен пример кода:
private HashMap<Integer, Bitmap> bitmaps = new HashMap<Integer, Bitmap>();
public Bitmap getBitmap(int id) {
Bitmap bitmap;
if(!bitmaps.contains(id)) {
if(// Bitmap budget close to being exeeded?) {
bitmaps.keyValues().get(0).recycle();
bitmaps.remove(bitmaps.keyValues().get(0));
}
bitmap = expensiveNetworkOperationToGetBitmap(id);
bitmaps.put(id, bitmap);
else {
bitmap = bitmaps.get(id);
}
return bitmap;
}
Еще раз, пожалуйста, не обращайте внимания на неэффективность выталкивания первого растрового изображения из HashMap.
Я надеюсь, что кто-тоесть предложение для закомментированного раздела.Если есть лучшее решение, чем это, было бы здорово услышать.