【问题标题】:How long do classes with static methods live in Android?带有静态方法的类在 Android 中可以存活多久?
【发布时间】:2014-09-15 20:28:19
【问题描述】:

这是对我的previous questions 之一的后续问题。

我有一个 LoadingActivity,它加载所有活动所需的一些图形并将其存储到一个静态类中。当按下 HOME 并恢复应用程序时,我尝试不再重新加载 LoadingActivity,因为它会占用大量内存,并且在多次加载图形后耗尽内存,因此无需再次启动 LoadingActivity。 我的问题是,静态类能活多久?我可以在恢复应用程序后依赖它的可用性吗,或者 可能 它在这里,因为 Android 由于内存问题而杀死它,或者只要 vm 运行它就一直在这里(这意味着只要手机正在运行)?

【问题讨论】:

  • 我相信只要您的申请流程还活着,它们就会一直存在。但在设备内存受限的应用程序开发中,将对象引用保持为静态并不是一个好主意。
  • 静态类与应用程序本身的生命周期相关联,这是 Android 的心血来潮 AFAIK。永远不要依赖静态类。期间。
  • “静态类”是指对“静态对象”的引用吗?您可能想澄清一下...听起来您在询问使用 static class 声明的类。
  • @Machinarius 有趣! Java 不支持静态类。 Bevor,这个问题没有任何意义。请说清楚。事实上,投票结束。
  • @Simon 我写的评论来自他们确实存在的大部分 C# 背景(最近在 Xamarin 上做了很多工作)。感谢您发现错误。 - OP:我的意思是类中的静态字段。

标签: android memory static-members dalvik


【解决方案1】:

正如Simon 指出的那样,“静态类”在不同语言中意味着不同的东西,Java 没有任何与其他语言中的静态类完全一样的东西。但我不认为这就是你在说的。您似乎在询问强静态引用所引用的对象是否可以被垃圾收集。如果是这样,答案是否定的。

类由类Class 的对象表示,可通过其ClassLoader 访问。因此,只要 ClassLoader 可以访问,Class 引用的任何内容都可以访问,在系统类加载器的情况下,只要 Java/Dalvik VM 存在。但这不是只要手机运行,因为每个应用程序都会创建一个独立的虚拟机。每当应用程序在后台运行时,可能会终止应用程序运行的整个进程和 VM。当您返回应用程序时,它的类将被重新加载。

如果静态字段确实是最佳选择,而不是 ContentProvider 或前面的 Service,那么每次您的应用程序恢复时,您都需要检查静态引用是否已初始化,如果它们已初始化则重新初始化它们为空。

【讨论】:

  • 这是错误的。没有静态类之类的东西,除非您指的是对象中的静态内部类。您是在谈论带有静态引用的 POJO 或活动吗?还是静态初始化的类字段?由于 Java 没有静态类,因此在您澄清之前,我会否决答案。
  • 理论上,一个给定的 ClassLoader 和它加载的所有类都可以被 VM 卸载。 Android 应用程序使用自定义加载程序加载,而不是“系统”加载程序。在实践中,Dalvik 不会卸载类,所以这是一个有争议的问题。
猜你喜欢
  • 1970-01-01
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
相关资源
最近更新 更多