Android-сборщик мусора и списки массивов - PullRequest
0 голосов
/ 19 мая 2011

У меня проблема с сборщиком мусора для Android, и я надеялся, что кто-то может указать на то, что я могу здесь делать неправильно. В начале моей программы у меня много данных, которые генерируются и добавляются в ArrayList. Пример того, что я делаю ниже ...

m_aUnitsPhysical.add(new UnitData("P01", 1, 0, 0, false, false, 300, UnitType.PHYSICAL, 1, "Unit Name"));

В моем конструкторе классов содержится около 236 таких операторов. Массив определяется как:

private ArrayList<UnitData> m_aUnitsPhysical;   // Physical array listing

И если это поможет, конструктор класса будет ...

public UnitData(String p_szID, int p_iAtk, int p_iDef, int p_iUp, boolean p_bLoot, boolean p_bHonor, int p_iCost, UnitType p_Type, int p_iLevel, String p_szName)

UnitData - мой класс, который просто хранит данные, вроде старой структуры Си. Я знаю, что жую огромное количество памяти во время этой операции. Однако, когда он завершает работу, сборщик мусора (как показано в logCat) запускает и освобождает огромные объемы данных.

Итак, что происходит? Сборщик мусора недоволен тем, как я делаю вышеупомянутое утверждение, или он говорит мне, что убивает память из других приложений? Есть ли способ сказать? Есть ли лучший способ сделать то, что я делаю выше, который не использовал бы столько памяти? Должен ли я попробовать использовать базу данных SqlLite вместо того, чтобы делать это таким образом?

Я редко получаю сообщения от моих пользователей о том, что у них возникла проблема с памятью, но они возникают. Преимущественно, когда они по какой-либо причине покидают приложение, а затем возвращаются к нему; данные в массиве исчезают. Я просто пытаюсь понять, как я должен делать это в случае, если я делаю это неправильно. Любое понимание будет с благодарностью!

Ответы [ 3 ]

1 голос
/ 19 мая 2011

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

Тем не менее, 200 записей не должны вызывать проблем с памятью.Если проблема возникает после того, как пользователь повторно открывает ваше приложение несколько раз, убедитесь, что вы не загружаете никакие данные без необходимости;проверьте, не заполнен ли уже ваш массив, прежде чем загружать его снова.

0 голосов
/ 20 мая 2011

GC никогда не удаляет объекты с сильными ссылками (то есть, на которые нет ссылок через WeakReference и т. П.), Даже если ему не хватает памяти (в этом случае он выбрасывает OutOfMemoryError) .

Ваша проблема должна быть где-то еще.

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

0 голосов
/ 19 мая 2011

Использование базы данных для больших объемов данных.это лучший и рекомендуемый способ.

для текущей настройки попробуйте создать меньше объектов.Попробуйте это с одним объектом и просто замените его данные и добавьте его в список. Не знаю, улучшит ли это производительность, но я верю, что так и должно быть.конструкторы стоят дорого.

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