Я использую 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);
}
@CommonsWare Изображения имеют разрешение 480x640 пикселей
Попробуйте добавить android: largeHeap = "true" в тег приложения манифеста.
@MohammedJunaid Я уже это сделал, но не повезло. Приложение все еще останавливается
Тогда, вероятно, может помочь уменьшение изображения.
@MohammedJunaid, можешь мне сказать, как это сделать?
Вы можете использовать скольжение для загрузки / показа изображений, lib будет масштабировать изображение, чтобы избежать OutOfMemoryError
как указано в ответе ниже, используйте библиотеку загрузки изображений, которая эффективно загружает изображения, такие как Glide или Picasso, поскольку они предоставляют методы для уменьшения изображения до более низкого разрешения.
Не используйте 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
сделало это возможным. Спасибо!
«Общий размер изображения составляет около 7 МБ» - если вы имеете в виду размер изображений на диске, это не имеет особого значения. Важен размер изображений в памяти, который привязан к разрешению изображения. Какое разрешение изображений (т.е. их ширина и высота в пикселях)?