我正在考虑在我正在构建的Android应用中使用单例模式的适配器和帮助器,但我不太熟悉Java的垃圾收集以及静态属性(例如static FooBar instance
)如何影响内存的使用。
它是否会对Android应用产生足够大的影响,我应该避免使用它?
答案 0 :(得分:5)
取决于“影响内存使用”的含义。对象不会更大或更小,因为有一个实例由单例模式强制执行。从这个意义上说,没有区别。
如果这意味着你肯定最多只有一个对象的内存副本而不是几个,是的,它可以帮助。
通常人们的意思是,单身人生活多久了?当应用程序在后台时,它会不停地占用内存?
static
成员附加到其Class
的实例,该实例又附加到其ClassLoader
。所以单身人士和ClassLoader
一样长。在Android中,应用程序的ClassLoader
在onDestroy
而不是onPause
消失了,所以单身就意味着即使应用程序在后台也能保留内存。
答案 1 :(得分:3)
正如其他人所说,这取决于。它可能是坏的情况是单例是否持有对可能被垃圾收集的对象的引用。如果对象中有很多引用或对大对象的引用,那么您可能正在使用不需要的内存。您可以通过使用弱引用来解决它,但是如果它们被垃圾收集,您必须有代码在需要时重新创建对象。您无法使用单例模式,这将允许收集垃圾(至少可能),但代价是创建和丢弃对象。最佳解决方案取决于对象的详细信息及其用法。总是要避免的一件事是继续引用UI对象,例如View。