我有一些不清楚的情况:
在最后一次参考持有活动被销毁后,静态单例会被垃圾收集吗?因为Application中没有对单例实例的引用。那么我可以依靠单身人士吗?
官方Android doc:
通常不需要子类Application。在大多数情况下, 静态单例可以在更模块化的情况下提供相同的功能 方式。
通过一些帖子:
在开发应用程序时,我找到了 有时会发生一些与活动绑定的静态变量 即使他们之前已经初始化,也要保持未初始化状态!一世 我认为当一个静态变量被初始化时,它就会保持不变 应用程序的整个生命周期,但似乎并非如此。
换句话说,如果没有任何东西持有对我的静态单例类的引用,那么阻止它被垃圾收集和销毁的是什么?
答案 0 :(得分:15)
不,因为如果它是一个单例,它在它的类中存储为static
字段,并且通常单例不会被客户端破坏,即你不会放置一个静态方法deleteInstance()
对null
的引用,以便如果没有其他人使用它,它就有资格进行垃圾收集。对于静态字段,当加载类的类加载器被丢弃时,将发生垃圾收集。
因此,关键字static
本身可能会导致内存泄漏,如果它引用了Activity对象,那么在使用它时应该非常小心。
答案 1 :(得分:6)
是。每次离开应用程序时(例如,您的应用程序打开相机应用程序拍照,或打开浏览器打开链接,或者用户只需按下后退按钮),您的Application
对象就有可能出现当您导航回应用程序时,将会销毁并重新创建。
您应该在自定义static {}
类的Application
块中初始化任何静态变量(如果有),或者在Activities
中初始化以确保它们不为空。
请注意,更有可能在硬件较弱,内存较低的设备上遇到此问题,但您可能会发现它可能会在任何设备上发生。
底线是,在android中,不要指望你的静态变量会随时留在内存中。始终检查它们是否存在,并在必要时在适当的位置重新初始化它们。
修改强>
我知道它已经很长时间了,我完全忘了这个帖子,无论如何,这里是官方Android生命周期文档的来源:
http://developer.android.com/training/basics/activity-lifecycle/recreating.html
答案 2 :(得分:3)
您无法控制Java对象何时变为垃圾回收。当没有更多(非循环)引用时,对象就有资格进行垃圾回收。此外,使用Android,您无法控制何时从内存中删除活动。
单身人士应该代表一直存在的东西。
你不能强迫任何对象被垃圾收集;您可以请求垃圾收集器使用System.gc()
运行,但它只是一个请求。
如果你想让一个“单身”符合垃圾收集的条件,你可能想要一个方法将静态变量设置为null(并希望没有别的东西带有引用的副本) 。显然,下次有人要求实例时,需要重新创建。当然,这不是一个单身人士。
答案 3 :(得分:-3)
即使活动被破坏,所有单例对象也将保留。