ImageAdapter и ListView (java.lang.OutOfMemoryError: размер растрового изображения превышает бюджет виртуальной машины) - PullRequest
1 голос
/ 16 июня 2010

Я использую ListView для отображения изображений, которые я предоставляю через класс ImageAdapter.он отлично работает на моем устройстве (и на многих других устройствах, на которых я его тестировал), но каким-то образом, когда я использую эмулятор и долго нажимаю кнопку вверх / вниз - я получаю ошибку outOfMemory после 10-15 секунд.

Я пытался очистить кеш, отменить кеш и т. Д. - ничего не помогло.

Я знаю, что этот сбой встречается довольно редко (я не мог воспроизвести его на любом "реальном" устройстве), но я вижу в DDMS, что «освобождение ГК» увеличивается во время этого длинного нажатия, и я не могу найти способ очистить их.

Любая помощь будет оценена, Tnx.

Ответы [ 3 ]

2 голосов
/ 16 июня 2010

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

Другая опция inJustDecodeBounds может помочь вам найти правильное значение inSampleSize http://groups.google.com/group/android-developers/browse_thread/thread/bd858a63563a6d4a

Вам также следует рассмотреть возможность использования опции inPurgeable http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inPurgeable. Это позволяет системе освободить память, чтобы избежать OutOfMemory.

1 голос
/ 24 февраля 2012

Я только что столкнулся с этой проблемой пару минут назад. Я решил это, сделав лучшую работу по управлению моим списком адаптера. Я подумал, что это проблема с сотнями изображений размером 50x50 пикселей, которые я использовал. Оказывается, я пытался раздуть свой пользовательский вид при каждом показе строки. Просто проверив, завышена ли строка, я устранил эту ошибку и использую сотни растровых изображений. Это на самом деле для Spinner, но базовый адаптер все равно работает для ListView. Это простое исправление также значительно улучшило производительность адаптера.

@Override
public View getView(final int position, View convertView, final ViewGroup parent) {

    if(convertView == null){
        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.spinner_row, null);
    }
...
0 голосов
/ 15 августа 2011

У меня была такая же проблема в моем ListView.Я смог уменьшить объем памяти, загружаемой моими загрузками, масштабируя изображения на месте и используя inPurgeable, как описывает Федор.См. Код здесь: Как масштабировать растровое растровое изображение на месте без предварительного чтения всего изображения?

...