2012-12-30 15 views
0

几个月来,我一直在用AndEngine框架测试我的技能来开发适用于Android的游戏。
现在我正面临着一个令人困惑的问题,在我们的项目中,我们在本活动中持有活动的所有TextureAtlas(即纹理),其中包含一个活动的静态 HashMap。这可能会产生一些内存泄漏问题或这样的不愉快的东西?我听说过很多Android中静态变量的矛盾,所以我不知道该怎么想。在Android活动中将(大)hashmap存储在静态变量中安全吗?

请注意屏幕旋转被阻挡,所以至少有一个陷阱少了。

在此先感谢!

回答

2

这可能会产生一些内存泄漏问题或像这样的不愉快的东西?

按照定义,Java中的静态数据成员是内存泄漏。这些对象以及它们引用的任何东西都不能被垃圾收集,至少要等到对它们的静态引用被删除为止。

这是否是一个问题是另一回事。例如,泄漏四字节整数不会成为问题。您可以使用DDMS生成堆转储并使用MAT来检查它,以查看“realz”您的静态HashMapTextureAtlas是多少内存。

对于像HashMap这样的静态集合,关键将确保您删除不再需要的条目。内存泄漏成为一个问题,当收集增长和增长,因为你不断增加的东西给他们,永远不会删除任何东西。根据你的情况,一个WeakHashMap(其中的键保持微弱,当没有别的东西正在使用你的密钥时允许地图条目消失)可能是更好的解决方案。

+0

Thx为答案。当我们有功能屏幕来查看宝宝的行为时,我可能会在稍后做这件事。这可能取决于我们放入HashMap的纹理数量...... – Sephy

1

当存在对Activity实例的反向引用时,静态变量很糟糕。因为活动在使用应用程序的生命周期中多次重新创建(例如,当您切换手机时)。

例如,下面的代码是安全的:

private static Long mMyLong; 

但是这个人是不是安全的:

private static Context mContext; 

小心,有时,也有一些非明显的反向引用。

为了避免这种麻烦,您应该将您的静态HashMap存储在您的应用程序类中(您可以在这里找到我关于创建应用程序类的其他文章https://stackoverflow.com/a/13994622/1789730)。因此,无论您的活动生命周期如何,您的hashmap都将被创建一次。此外,你将获得表现。为了确保没有任何引用,你可以在YourActivity.onDestroy()中设置hashmap及其内容为null,并在YourActivity.onCreate()中重新创建它。

如果hashmap保留任何死亡引用,你可以使以下经验。像上面说的那样把hashmap放在应用程序类中。将手机翻转至纵向/横向以重新创建活动。因此,如果您的活动使用hashmap对象崩溃,那意味着它会保持对您的活动的引用。

+0

事实上,我知道在上下文在风景和肖像之间翻转时会重新创建这个问题,但我不确定这会导致与TextureAtlas相同。这个类没有提到上下文。 thx为答案 – Sephy

+0

所以你的问题应该是:“TextureAtlas是否具有对上下文的引用?” Personnally我不知道,检查它的源代码ANdroid。 – gezdy

+0

以及我要求的上下文,但对任何其他类可能会导致这样的问题是真的。除了我没有意识到任何比上下文。因此,我的问题... – Sephy

相关问题