(标题是误导性的,因为垃圾收集器只收集对象,但我发现这个标题更直接)
假设我在名为Global的类中有一个名为“userid”的静态变量的Android应用程序(在初始化时为null)。
如果我将“userid”变量设置为Android应用程序生命周期的某个值,比如Global.userid =“myid”,那么当Android应用程序还活着时,此变量是否可能变为空?
换句话说,Android VM是否有可能卸载Global类并由于低内存问题而“杀死”这个全局静态变量而不会杀死整个Android应用程序?
我担心在应用程序运行时userid突然变为null(由于内存不足问题),因此崩溃了整个应用程序。
修改的 我误解了一些概念(在申请流程与活动之间)。谢谢你的所有答案!
答案 0 :(得分:21)
如果我将“userid”变量设置为Android应用程序生命周期的某个值,比如Global.userid =“myid”,那么当Android应用程序还活着时,此变量是否可能变为空?
如果你自己设置为null
,是的。
换句话说,Android VM是否有可能卸载Global类并由于低内存问题而“杀死”这个全局静态变量而不会杀死整个Android应用程序?
正常情况下,没有。
如果您使用自定义类加载器,可以想象可能存在类卸载的情况(因此其上的任何静态数据成员都 poof ) - 我似乎记得那里是关于这种情况的讨论,但我忘记了结论。但是,非常很少有应用程序应该搞乱自定义类加载器。
我担心在应用程序运行时userid突然变为null(由于内存不足问题),因此崩溃了整个应用程序。
这不应该发生。
可以发生的是用户在您的应用中,通过HOME(或通知,来电或最近任务列表等)离开应用,然后通过recent-tasks列表返回到您的应用。如果您的进程在不在前台期间终止,则当您从最近任务列表启动活动时,您的静态数据成员将为null
。由于用户返回的活动可能不一定是您的启动器活动,因此您的应用可能会像静态数据成员自发转为null
一样,即使这是因为您的流程已终止并重新启动。
这是静态数据成员需要非常小心地使用 的几个原因之一。
答案 1 :(得分:1)
如果您将变量设置为静态,那么您可以从应用中的任何位置访问它,而无需每当我认为这是Singleton pattern的良好候选者时创建该类的新实例。
String userid = Global.getInstance().userid;