Студия Android выдает OutOfMemoryError в Viewflipper

Я использую ViewFlipper для динамического отображения изображений с помощью массива. Изображений около 100. Когда я запускаю это действие, приложение останавливается с ошибкой java.lang.OutOfMemoryError:. Размер комбинированного изображения составляет около 7 МБ. Что нужно сделать, чтобы отображались все изображения? Ниже приведен код Java, который я использую.

ViewFlipper viewflipper;
int result_images[]= 
{R.drawable.resultone,R.drawable.resulttwo,R.drawable.resultthree,
...,R.drawable.resultonehundredsixteen};

viewflipper = (ViewFlipper) findViewById(R.id.viewflipper);
for(int i=0;i<result_images.length;i++)
{
    //  This will create dynamic image view and add them to ViewFlipper
    setFlipperImage(result_images[i]);
}

viewflipper.startFlipping();

private void setFlipperImage(int res) {
    Log.i("Set Filpper Called", res+"");
    ImageView image = new ImageView(getApplicationContext());
    image.setBackgroundResource(res);
    viewflipper.addView(image);
}

«Общий размер изображения составляет около 7 МБ» - если вы имеете в виду размер изображений на диске, это не имеет особого значения. Важен размер изображений в памяти, который привязан к разрешению изображения. Какое разрешение изображений (т.е. их ширина и высота в пикселях)?

CommonsWare 11.10.2018 14:28

@CommonsWare Изображения имеют разрешение 480x640 пикселей

Strooks 11.10.2018 14:30

Попробуйте добавить android: largeHeap = "true" в тег приложения манифеста.

Mohammed Junaid 11.10.2018 14:30

@MohammedJunaid Я уже это сделал, но не повезло. Приложение все еще останавливается

Strooks 11.10.2018 14:31

Тогда, вероятно, может помочь уменьшение изображения.

Mohammed Junaid 11.10.2018 14:31

@MohammedJunaid, можешь мне сказать, как это сделать?

Strooks 11.10.2018 14:34

Вы можете использовать скольжение для загрузки / показа изображений, lib будет масштабировать изображение, чтобы избежать OutOfMemoryError

Kapil Rajput 11.10.2018 14:36

как указано в ответе ниже, используйте библиотеку загрузки изображений, которая эффективно загружает изображения, такие как Glide или Picasso, поскольку они предоставляют методы для уменьшения изображения до более низкого разрешения.

Mohammed Junaid 11.10.2018 14:36
0
8
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Не используйте viewflipper, используйте viewpager из android.support.v4. Взгляните на следующий образец, как использовать viewpager с адаптером. Более подробную информацию можно найти в следующем блоге Почта.

Взгляните на следующий статья. Вам необходимо масштабировать изображения и соответствующим образом размещать их. 7 мегабайт - это размер сжатых изображений. Растровые изображения занимают гораздо больше места.

Вы также можете попробовать и использовать библиотеку Пикассо или скользить для эффективной обработки изображений.

Ответ принят как подходящий

Каждое из этих изображений будет занимать 1228800 байтов кучи (640 x 480 x 4 байта / пиксель), что немного больше 1 МБ. 100 из них будут занимать ~ 120 МБ места в куче. У вас не так много места в куче на многих устройствах Android, а ViewFlipper требует, чтобы вы предварительно загрузили все этих образов.

Вам нужно будет изменить свой подход, чтобы вы могли сохранить в памяти только несколько из этих изображений одновременно. Как минимум, для этого потребуется переключиться с ViewFlipper на что-то другое, не требующее предварительной загрузки всего (например, используйте AdapterViewFlipper).

Кроме того, вам нужно будет поместить эти образы в res/drawable-anydpi/ или res/drawable-nodpi/. Я предполагаю, что у вас они есть где-то еще (например, res/drawable/), и в этом случае их потребление памяти существенно вырастет на устройствах с высоким разрешением.

использование AdapterViewFlipper сделало это возможным. Спасибо!

Strooks 11.10.2018 14:53

Другие вопросы по теме