ОК - теперь трассировка стека присоединена: ConcurrentModificationException Вы модифицируете ArrayList из разных потоков или перебираете его.Либо вам нужно синхронизировать доступ, либо использовать другую коллекцию, например ConcurrentHashSet.
Но, возможно, будет интересно и следующее (мой исходный ответ): p
Похоже, что вы кешируете реальноеРастровые объекты с данными всего пикселя -> Полагаю, вы получили OutOfMemoryException
Сборщик мусора является асинхронной операцией, и если вы очищаете свой растровый массив, растровые изображения не выгружаются из памяти мгновенно.Если вы вставляете новые, может случиться так, что старые все еще находятся в памяти, а новые тоже загружаются.
Решение: не кэшируйте растровые изображения таким образом, вы делаете.
Это разные вещи, которые вы можете попробовать (зависит от вашего конкретного сценария):
1) Если они хранятся на SD-карте или чем-то еще, кэшируйте только путь к растровым изображениям в вашей коллекции и загружайтеих, если они необходимы для рисования.
2) Используйте Drawable объекты вместо растровых изображений - у них есть несколько интересных методов и алгоритмов для оптимизированного доступа к растровым данным.
3) Для оптимизациипроизводительность использовать что-то вроде SoftReference или подобное - может быть WeakRefernce .SoftReferences могут быть выгружены GC по требованию (когда памяти становится мало).В этом случае вы должны проверить, является ли мягкое отражение нулевым или все еще существует.Например:
ArrayList<SoftReference<Bitmap>> _graphics = new ArrayList<SoftReference<Bitmap>>();
...
for (int i = 0; i < _graphics.size(); i++)
{
Bitmap b = _graphics.get(i).get();
if (b == null)
{
b = loadFromSomewhere(i);
_graphics.add(new SoftReference<Bitmap>(b), i);
}
... do something wwith your bitmap
}
Этот фрагмент кода не тестировался и не записывался с помощью редактора Java (извините за ошибки при вводе или неправильные сигнатуры методов).