我遇到了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是我的一类,只是存储数据,有点像旧的C结构。我知道在这次手术中我正在嚼大量的记忆。然而,当它完成时,垃圾收集器(如logCat中所示)启动并释放大量数据。
那么,发生了什么?垃圾收集器是否对我正在做上述声明的方式感到愤怒,还是告诉我它正在从其他应用程序中消除内存?有什么方法可以说出来吗?有没有更好的方法来做我上面做的事情,不会使用那么多的内存?我应该尝试使用SqlLite数据库而不是这样做吗?
我的用户很少收到他们遇到内存问题的报告,但他们正在发生。主要是当他们出于某种原因离开应用程序然后回到它;数组中的数据消失了。我只是试图了解我应该如何这样做,以防我做错了。任何见解将不胜感激!
答案 0 :(得分:1)
如果您使用静态数据集(正如您所说的那样)运送应用程序,那么您可能希望将数据集包含在预制数据库中。这是关于如何做到这一点的great tutorial。
也就是说,200条记录不应该导致任何内存问题。如果在用户重新打开您的应用程序几次后出现问题,请确保您没有不必要地重新加载任何数据;在再次加载之前检查您的阵列是否已填充。
答案 1 :(得分:0)
将数据库用于大量数据。这是最好的和推荐的方式。
对于当前设置尝试创建更少的对象。尝试使用单个对象,只需替换其数据并将其添加到列表中。不知道这是否会提高性能,但我相信它应该。构造者代价高昂。
答案 2 :(得分:0)
GC将从不删除强引用对象(即未通过WeakReference
等引用),即使内存不足(在这种情况下,它会抛出{ {1}})。
你的问题必须在其他地方。
(其他海报建议使用数据库来存储您的值,但对于200个项目,我认为您的方法没有问题 - 除非这些对象非常复杂/巨大)