Android OutOfMemoryException на createScaledBitmap и роль SoftReferences? - PullRequest
0 голосов
/ 27 апреля 2011

Я получил ООМ. Я знаю, что этот вопрос уже охватывался многими предыдущими вопросами, но мой имеет отношение к внутренним компонентам Android и Java в целом.

Когда я загружаю изображения в случайных точках, я получаю это страшное исключение OOM.

У меня есть мои изображения в HashMap>. Из определения SoftReferences я бы ожидал, что Drawables будет GC'ed, если памяти недостаточно.

Напротив, из моего предыдущего исследования я вижу, что растровое изображение в drawable размещается в другой куче (собственной куче), чем куча моих приложений. Это объясняет, почему в DDMS, несмотря на то, что я вижу 6 МБ памяти, которую я использую, мое приложение по-прежнему падает.

Также кажется, что SoftReferences "идеальны" для кешей и рекомендуются для использования инженерами Android.

Мой вопрос таков: поскольку куча моего приложения никогда не достигает точки MAX, это должно означать, что мои SoftReferences никогда не обрабатываются GC.

Как я могу решить эту проблему? Есть ли тогда какая-то выгода от использования SoftReferences? Я что-то не правильно понимаю?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 января 2013

Вы пробовали использовать метод recycle()? Это делает ваше растровое изображение бесполезным, и поэтому сборщик мусора может выполнять свою работу.

0 голосов
/ 27 апреля 2011

У меня была такая же проблема, я использовал SoftReference HashMap, но все еще получал ошибку OOM. Единственный способ избавиться от него - не использовать большие изображения, потому что BitmapFactory.decodeStream требует много памяти для декодирования изображения.

...