Android中的静态单例生存期

Arv*_*vis 27 singleton android

我有一些不清楚的情况:

在最后一次参考持有活动被破坏后,静态单例是否会被垃圾收集?因为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/

在开发应用程序时,我发现有时一些绑定到活动的静态变量恰好是未初始化的,即使它们之前已被初始化!我认为当一个静态变量被初始化时,它在应用程序的整个生命周期中都是如此,但事实并非如此.

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

Raf*_*ele 15

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

因此,关键字static本身可能会导致内存泄漏,如果它引用了Activity对象,那么在使用它时应该非常小心.

  • 在android中不是这样.当应用程序不在前台时,dalvik VM可能会破坏类以及任何静态变量,并且设备需要释放内存. (34认同)
  • 我经历过.在硬件较弱的设备上,通常情况是,只要您的应用程序进入后台,您的Application对象以及您的活动将被销毁,然后在后台重新创建.在这种情况下,如果不在`static {}`块中初始化它们,即使静态变量也会变为null.这是一个关于这个http://stackoverflow.com/questions/9541688/static-variable-null-when-returning-to-the-app的SO帖子 (7认同)
  • 也许,但关键是一旦进程被杀死,那不是*静态字段被设置为null*.简单地说,应用程序再次被引导,所有类对象也是如此,所有字段都是如此.它不会破坏标准Java,因为应用程序是从头开始的 (7认同)
  • @AdamL.Mónos[这是一个演示项目](https://docs.google.com/open?id=0B7Cy5X-NhwtKX1J2NDE0QTByOWM).第一个活动包含一个静态字段,它在每个`onResume()`上占用更多内存.请注意,`onResume()`必须在`onPause()`之后调用,这意味着Activity离开前景并可能被销毁.静态字段永远不会被取消,最终会触发"OutOfMemoryError" (4认同)
  • 你在哪里看过的?Android可以在不在前台时销毁活动,但不会破坏Java规则.事实上,如果您的活动在任何地方被引用,它们就不会被垃圾收集而且您有泄漏.Romain Guy有一篇关于此事的帖子.不要指望Android是一个*疯狂*系统,只是在内存不足时摧毁周围的物体. (3认同)

Ada*_*nos 7

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

您应该static {}在自定义Application类的块中初始化任何静态变量(如果有),或者在您的自定义类中Activities确保它们不为空.

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

底线是,在android中,不要指望你的静态变量会随时留在内存中.始终检查它们是否存在,并在必要时在适当的位置重新初始化它们.

编辑:

我知道它已经很长时间了,我完全忘了这个帖子,无论如何,这里是官方Android生命周期文档的来源:

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

  • @Arvis 不用担心单身人士。[这是一个测试](https://docs.google.com/open?id=0B7Cy5X-NhwtKX1J2NDE0QTByOWM) 证明它们永远不会被扔掉。顺便说一句,为什么你需要共享一个原始套接字?如果您的问题不是理论上的,而是针对特定应用的,请添加更多信息,我们会回答。您引用的帖子似乎完全错误:除非它可以复制或链接文档,否则我们不能假设静态字段(即类实例)在应用程序进程处于活动状态时在运行时卸载 (2认同)
  • @Arvis如果你看一下这个问题的答案,他们都同意在进程活着的时候没有卸载类.所以,再次,您不应该担心您的静态字段突然变为空 (2认同)