30

我有一些不清楚的情况:

在最后一个引用持有 Activity 被销毁后,静态单例是否会被垃圾收集?因为 Application 中不再有对单例实例的引用。那么我可以依赖单身人士吗?

通过官方Android 文档

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

通过一些帖子:

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

在开发应用程序时,我发现有时某些绑定到活动的静态变量碰巧未初始化,即使它们之前已初始化!我认为当一个静态变量被初始化时,它会在应用程序的整个生命周期中保持不变,但情况似乎并非如此。

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

4

4 回答 4

19

不,因为如果它是一个单例,它作为一个static字段存储在它的类中,并且通常单例不会被客户端破坏,即你不会放置一个静态方法deleteInstance()来设置引用,null这样如果没有其他人使用它,它就是合格的用于垃圾收集。对于静态字段,垃圾回收会在加载该类的类加载器被丢弃时发生。

由于这个原因,关键字static本身可能会导致内存泄漏,如果它引用了 Activity 对象,所以在使用时要非常小心。

于 2012-12-15T10:03:02.970 回答
7

是的。每次你离开你的应用程序时(例如你的应用程序打开相机应用程序来拍照,或者打开浏览器打开一个链接,或者用户只是按下后退按钮),你的Application对象就有可能被销毁并重新创建当您导航回您的应用程序时。

如果你有一个,你应该在你的自定义类的一个static {}块中初始化任何静态变量,或者在你的类中初始化它们以确保它们不会为空。ApplicationActivities

请注意,在硬件较弱、内存较低的设备上更有可能遇到此问题,但您应该期望它可能发生在任何设备上。

底线是,在 android 中,不要期望您的静态变量会随时保留在内存中。始终检查它们是否存在,并在必要时在正确的位置重新初始化它们。

编辑:

我知道已经很久了,我完全忘记了这个线程,无论如何,这里是官方 Android 生命周期文档的来源:

http://developer.android.com/training/basics/activity-lifecycle/recreating.html

于 2012-12-15T10:02:53.127 回答
3

您无法控制 Java 对象何时被垃圾回收。当一个对象不再有(非循环)引用时,它就有资格进行垃圾回收。此外,使用 Android,您无法控制 Activity 何时从内存中删除。

单例应该代表始终存在的东西。

  • 您不能强制对任何对象进行垃圾收集;您可以请求垃圾收集器运行,System.gc()但这只是一个请求。

  • 如果您想使“单例”符合垃圾收集的条件,您可能希望有一种方法将静态变量设置为 null(并希望没有其他任何东西获取引用的副本)。显然,下次有人要求实例时,就需要重新创建它。当然,此时它并不是真正的单例。

于 2012-12-15T10:07:25.977 回答
-4

即使活动被销毁,所有单例对象都将保留。

于 2014-12-30T11:37:20.520 回答