2012-04-25 2 views
0

У меня проблема с выпуском памяти. У меня есть Hashmap, в котором я добавляю Bitmap, а количество растровых изображений довольно велико. По этой причине я получаю OutOfMemoryError. Поэтому для этого я решил выпустить Bitmap, который наименее используется от Collection, к хрусту памяти или системе, становящимся низким в памяти кучи.Общая доступная память для логики управления памятью

Для получения текущей памяти я использовал «ActivityManager.MemoryInfo.availMem», но при этом дает общую объем памяти RAM, недоступную память кучи. И я обнаружил, что эта память не обновляется при выпуске растровых изображений из коллекции.

Тогда я использовал эти три метода:

Debug.getNativeHeapAllocatedSize() 
Debug.getNativeHeapFreeSize() 
Debug.getNativeHeapSize() 

, но я обнаружил, что NativeHeapSize продолжает расти до некоторого определенного уровня, скажем, 16 МБ  , изменяя после что OutOfMemoryError происходит. В этом также я обнаружил, что NativeHeapAllocatedSize и getNativeHeapSize не уменьшается при освобождении Bitmap от Collection.

Как решить эту проблему?

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

+1

Возможно, вы захотите взглянуть на это http://developer.android.com/training/displaying-bitmaps/index.html – Michaeldcooney

ответ

0

Хранение Bitmaps в памяти ОЧЕНЬ дорого. В зависимости от формата изображения каждый пиксель может потреблять до 4 байт памяти.

Вы отобразите весь Collection из Bitmaps в то же время? Если нет, я бы настоятельно рекомендовал, чтобы магазин НЕ сохранил неопубликованный Bitmaps, но сохранил URI для загрузки изображения и загрузил его на лету, когда вам это нужно.

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

+0

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

+0

Вы должны обязательно сохранить изображения в локальном файле, чтобы вы только загружали их с сервера один раз. Загрузка и отображение изображения из локального файла может быть очень быстрым! – slayton

+0

Да, я делаю с вашим предложением, но, возможно, у нас есть ActualMemoryAvailable и TotalMemoryAvailabe в приложении? –

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