Android中的静态单例生存期

时间:2012-12-15 09:53:10

标签: android singleton

我有一些不清楚的情况:

在最后一次参考持有活动被销毁后,静态单例会被垃圾收集吗?因为Application中没有对单例实例的引用。那么我可以依靠单身人士吗?

官方Android doc

  

通常不需要子类Application。在大多数情况下,   静态单例可以在更模块化的情况下提供相同的功能   方式。

通过一些帖子:

https://web.archive.org/web/20160729201921/http://www.devahead.com/blog/2011/06/extending-the-android-application-class-and-dealing-with-singleton/

  

在开发应用程序时,我找到了   有时会发生一些与活动绑定的静态变量   即使他们之前已经初始化,也要保持未初始化状态!一世   我认为当一个静态变量被初始化时,它就会保持不变   应用程序的整个生命周期,但似乎并非如此。

换句话说,如果没有任何东西持有对我的静态单例类的引用,那么阻止它被垃圾收集和销毁的是什么?

4 个答案:

答案 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)

即使活动被破坏,所有单例对象也将保留。