在Android活动中将(大)hashmap存储在静态变量中是否安全?

时间:2012-12-30 16:32:53

标签: android andengine

几个月来,我一直在用AndEngine框架测试我的技能,为Android开发游戏 现在我面临一个令人困惑的问题,在我们的项目中,我们在此活动中的静态 HashMap中保存活动的所有TextureAtlas(即纹理)。这会产生一些内存泄漏问题或者这样的不愉快的事情吗?我在Android中听到了许多与静态变量相矛盾的事情,所以我不确定该怎么想。

请注意屏幕旋转被阻止,因此它至少有一个陷阱。

提前致谢!

2 个答案:

答案 0 :(得分:2)

  

这会产生一些内存泄漏问题或者这样的不愉快的事情吗?

根据定义,Java中的静态数据成员是内存泄漏。这些对象及其引用的任何内容都不能被垃圾收集,至少在删除对它们的静态引用之前是这样。

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

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

答案 1 :(得分: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保留任何死亡引用,您可以使以下经验成为sur。将hashmap放在应用程序类中,如上所述。将手机翻转为纵向/横向以重新创建您的活动。因此,如果您的活动使用hashmap对象崩溃,则意味着它会保留对您的活动的引用。