繁体   English   中英

Android垃圾收集器和ArrayLists

[英]Android Garbage Collector and ArrayLists

我在使用Android Garbage Collector时遇到问题,希望有人可以指出我在这里做错了什么。 我的程序开始时有很多数据,这些数据已生成并扔到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数据库而不是这样做吗?

我很少收到用户的报告,说他们遇到了内存问题,但是这种情况正在发生。 主要是当他们出于某种原因离开应用程序然后又返回到该应用程序时; 数组中的数据消失。 我只是想弄清楚如果我做错了应该怎么做。 任何见解将不胜感激!

如果您附带的应用程序带有一组静态数据(听起来确实如此),那么您可能希望将数据集包含在预制数据库中。 这是有关如何做到这一点的出色教程

也就是说,200条记录不应引起任何内存问题。 如果在用户重新打开您的应用几次后出现问题,请确保您没有不必要地重新加载任何数据; 在再次加载之前,请检查数组是否已被填充。

使用数据库处理大量数据。 这是最好的建议方式。

对于当前设置,请尝试创建较少的对象。 尝试使用单个对象执行此操作,然后替换其数据并将其添加到列表中。.不知道这是否会提高性能,但我相信应该。 构造函数很昂贵。

即使内存用完,GC也永远不会删除强引用的对象(即未通过WeakReference等引用的对象)(在这种情况下,它将抛出OutOfMemoryError )。

您的问题必须在其他地方。

(其他张贴者建议使用数据库来存储您的值,但是对于仅200个项目,我认为您的方法没有问题-除非这些对象非常复杂/巨大)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM