2010-11-23 4 views
0

Я работаю над простым приложением, которое рисует маленькие растровые изображения на экране и немного затрудняет очистку экрана. Мои растровые изображения хранятся в ArrayList с именем _graphics, и мне нужно очистить экран, поэтому я очищаю свой ArrayList. Это отлично работает при очистке экрана, но через некоторое время моя сила приложения закрывается.Ошибка удаления растровых изображений [Android]

Если я рисую около 50 растровых изображений на экране, это заставит закрыть первый раз, когда я его очищу, однако, если я нарисую только 5, я могу получить около 10 удалений, прежде чем он сработает. Я предполагаю, что это связано с тем, что GC не очищает растровые изображения правильно. У кого-нибудь есть идеи по этому вопросу?

+1

Вам необходимо отправить вывод логарифма. – EboMike 2010-11-23 19:18:25

+0

Вот вы: http: //pastebin.com/DVNTGhZj – PeterW 2010-11-23 19:38:41

ответ

1

Перейти к файлу Logcat Я, кажется, нашел ошибку (новый Android Dev: p даже не знал, что он существует). Это произошло из-за исключения ConcurrentModificationException. Кажется, что все работает сейчас = D

1

OK - теперь используется трассировка стека: ConcurrentModificationException Вы изменяете ArrayList из разных потоков или итерации по нему. Либо вам нужно синхронизировать доступ, либо использовать другую коллекцию, например ConcurrentHashSet.

Но, возможно, следующий (мой источник ответа) будет тоже интересно: р

Похожи, что вы кэширование объектов реального Bitmap всех данных пикселя -> Я думаю, вы получили OutOfMemoryException

Сборщик мусора представляет собой асинхронную операцию, и если вы очищаете массив растровых изображений, растровые изображения не выгружаются из памяти мгновенно. Если вы вставляете новые, может случиться, что старые все еще находятся в памяти, а новые тоже загружаются.

Решение: Не кэшируйте растровые изображения таким образом, что вы делаете.

Это разные вещи, вы можете попробовать (в зависимости от YOUT конкретного scenrario):

1) Если они хранятся на SD-карте или что-то другое, кэш только пути к растровым изображениям в вашей коллекции и загружать их , если они необходимы для рисования.

2) Используйте Drawable objects вместо растровых изображений - у них есть интересные методы и алгоритмы для оптимизации доступа к данным растрового изображения.

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 
} 

Этот код snipet не тестируются и написаны с редактором Java (пожалуйста, простите опечатки или неправильные сигнатуры метода).

Смежные вопросы