OutOfMemory при наличии большого количества изображений на экране

У меня есть активность в моем приложении для Android, как показано на рисунке ниже:

мой экран

легенда:

  • серый: фоновое изображение на весь экран;
  • синий: 5 кругов разного размера;
  • зеленый: произвольное изображение;

Я анимировал круги с помощью View Animation (http://developer.android.com/guide/topics/graphics/view-animation.html), чтобы одновременно показывать только один.

Но я получил исключение OutOfMemory на некоторых устройствах и эмуляторах, которые я использовал для тестирования.

Вместо этого я изменил свой макет, чтобы использовать 3 ImageView, один с одним изображением 3 внутренних кругов, а другие с 1 внешним кругом, каждый из которых использует один и тот же файл изображения, но с разными размерами, и я анимирую их, включая и отключая их свойство видимости . Таким образом, я использую только 2 изображения вместо 5.

При таком подходе я перестал получать исключение OutOfMemory, я думаю, потому что я загружаю и отображаю меньше изображений, чем раньше.

К вашему сведению, у меня в папках размещены изображения разных размеров:

  • Drawable-hdpi
  • drawable-ldpi
  • drawable-mdpi
  • Drawable-xhdpi

Память настолько ограничена? Кто-нибудь может предложить лучшее решение, чтобы я мог продолжать использовать свои 5 изображений кругов?

Приложение небольшое, поэтому нет смысла идти по пути использования OpenGL.

Спасибо!


person Gustavo    schedule 28.08.2013    source источник
comment
Вы масштабируете свое произвольное изображение или просто бросаете изображение в ImageView?   -  person Alex Fu    schedule 28.08.2013
comment
Привет, я не масштабирую его.   -  person Gustavo    schedule 28.08.2013
comment
Ну, вероятно, поэтому вы получаете исключения OOM. Если изображение, которое вы используете для произвольного изображения, велико, и вы отображаете его как изображение меньшего размера, вам определенно следует уменьшить его масштаб, чтобы сохранить память. Посмотрите   -  person Alex Fu    schedule 28.08.2013
comment
На самом деле, когда я сказал произвольное изображение, я имел в виду, что изображение не имеет значения для контекста этой ситуации. Это статическое изображение, и у меня есть разные размеры в папках hpdi, ldpi, mdpi и xhpdi. Проблема с кругами.   -  person Gustavo    schedule 28.08.2013
comment
В этом случае я бы просто создал собственное представление, которое рисует круги или любые другие фигуры, которые вам нужны, и избегаю использования растровых изображений.   -  person Alex Fu    schedule 28.08.2013


Ответы (2)


Да, система Android гарантирует только 16 МБ памяти для одного приложения, но производители могут разрешить больше (обычно они так и делают). Но они не ограничены в этом, поэтому, если вы превысите этот предел, вы можете получить OutOfMemoryException на многих устройствах с небольшим объемом памяти.

person abbath    schedule 28.08.2013
comment
Это кажется слишком ограниченным для небольшого количества изображений, хотя они имеют большой размер. Я хотел услышать от людей, которые прошли через ту же ситуацию и нашли другое решение. - person Gustavo; 28.08.2013
comment
Я прошел через то, что не использовал такие большие изображения на одном экране одновременно. Если вы можете использовать только одно изображение для кругов, сделайте это, я сделал это, объединив их в коде, а также попробуйте проверить доступную память устройства и загрузить изображения в зависимости от полученных данных. - person abbath; 30.08.2013

Если это действительно просто круги, вам не понадобятся настоящие растровые изображения для них, но вместо этого можно использовать ShapeDrawable. Это сэкономит всю память для изображений кругов (и приведет к идеальным кругам во всех разрешениях).

Простой пример из другого элемента SO:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" >
    <gradient android:startColor="#FFFF0000" android:endColor="#80FF00FF"
        android:angle="270"/>
</shape>
person Ridcully    schedule 28.08.2013
comment
На самом деле это не просто круги, просто для простоты. Спасибо, в любом случае! - person Gustavo; 28.08.2013