Управление памятью в Android - PullRequest
0 голосов
/ 29 марта 2012

Итак, я впервые протестировал свою игру с помощью теста Обезьяны.Мне удалось пройти около 3 минут без сбоев, но я закончил сбоем с ошибкой нехватки памяти, и я пытаюсь выяснить, как я могу сделать это лучше.

Моя программа структурирована следующим образом:

  • Имеется передний экран, который запускает действие.
  • Вторичная активность - это то, где находится большая часть действия, а также где я разбился.
  • Я разбиваюсь по команде надувания
  • Моя игра форсирует портретный режим, это было прощечтобы сделать 1 макет, а не 2, работать ...
  • Есть несколько переменных класса, связанных с моей вторичной деятельностью.Я включу нестатические ниже.Я также включил некоторую подсказку для тех вещей, которые не очевидны относительно того, что они есть.

То, что я хочу знать, - как я могу улучшить управление памятью моегопрограмма, чтобы она не зависала.Я подозреваю, что мне нужно вручную удалить некоторые из этих переменных, но я не уверен, что это правильное место для этого.Спасибо!

private Level_Score_bar score_bar; // Custom view
private number_viewer num_viewer; // Custom view
private number_pad num_pad;       // Custom View
private int time,score,level,num_remaining,current_var,change_loc,time_remaining;
private ArrayList<Integer> the_key;
private ImageView Number_to_select;
private Boolean update_viewer; 
Random rseed;
Vibrator bzzz;
long ctime;
private Activity self=this;

private SharedPreferences prefs;
private Editor prefs_edit;

Произошла нехватка памяти

   setContentView(R.layout.level_layout);

Этот макет довольно сложный, содержит несколько изображений, кнопок, текстовых представлений и т. Д.

Ответы [ 3 ]

3 голосов
/ 01 апреля 2012

Оказывается, я был прямо на волосатом краю кучи.Я использую довольно много изображений, и оказывается, что я превысил «нормальный» размер кучи.Мне удалось улучшить эту ситуацию, сократив некоторые изображения, но лучшее решение пришло, изменив мой манифест следующим образом:

<application 
    android:label="@string/app_name" 
    android:icon="@drawable/logo" 
    android:screenOrientation="portrait" 
android:largeHeap="true">

Большая куча позволит мне делать будущие обновления (которые будутвключать в себя дизайн уровней и т. д., который занимал бы совсем немного места ...) В целом, это должно быть довольно минимальным эффектом.провести некоторое исследование и выяснить, что мое пространство кучи было недостаточно большим, но я также включил фрагмент кода @ Ramam-Mystry.

Я также использовал много ответов из этого превосходного вопроса в моем поиске.Я начал хранить ссылки вместо битовых карт и нескольких других связанных битов.В общем, мое потребление памяти сократилось на 25% и продолжает улучшаться.

Еще один совет - использовать функцию onLowMemory() в Activity, чтобы обрезать ненужную память.

2 голосов
/ 29 марта 2012

Похоже, вам нужно воспользоваться инструментом «Отслеживание размещения», который доступен в перспективе «DDMS» в затмении.

Это покажет вам, какие именно структуры данных потребляют память.*

1 голос
/ 29 марта 2012

Попробуйте использовать System.gc(); в onresume(), чтобы избежать утечек памяти при использовании изображений с высоким разрешением или высоким разрешением памяти при просмотре изображений.

Примечание. Для изображений с использованием растровых изображений сборка мусора по умолчанию не вызывается, поэтомупамять выполнения превышает выделенную память, когда память изображений выше.ручной сбор мусора, чтобы избежать утечки памяти.лучше вызвать onresume ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...