14

(标题具有误导性,因为垃圾收集器只收集对象,但我发现这个标题更直接)

假设我有一个 Android 应用程序,其中一个名为“userid”的静态变量位于一个名为 Global 的类中(在初始化时为 null)。

如果我在 Android 应用程序生命周期中将“userid”变量设置为某个值,比如 Global.userid =“myid”,那么当 Android 应用程序仍然存在时,这个变量是否可能变为 null?

换句话说,由于内存不足的问题,Android VM 是否可以卸载 Global 类并“杀死”这个全局静态变量而不杀死整个 Android 应用程序?

我担心用户 ID 在应用程序运行时突然变为空的情况(由于内存不足问题),从而导致整个应用程序崩溃。

编辑 我误解了一些概念(在应用程序流程与活动之间)。感谢所有答案!

4

2 回答 2

23

如果我在 Android 应用程序生命周期中将“userid”变量设置为某个值,比如 Global.userid =“myid”,那么当 Android 应用程序仍然存在时,这个变量是否可能变为 null?

如果你给null自己设置,是的。

换句话说,由于内存不足的问题,Android VM 是否可以卸载 Global 类并“杀死”这个全局静态变量而不杀死整个 Android 应用程序?

对于正常情况,没有。

如果您使用自定义类加载器,可以想象可能存在类被卸载的场景(因此它们上的任何静态数据成员都会发出噗声)——我似乎记得有过关于这种场景的讨论,但我忘记了结论。但是,很少有应用程序会使用自定义类加载器。

我担心用户 ID 在应用程序运行时突然变为空的情况(由于内存不足问题),从而导致整个应用程序崩溃。

那不应该发生。

可能发生的情况是用户在您的应用程序中,通过 HOME(或通知、来电或最近任务列表等)离开应用程序,然后通过最近任务列表返回到您的应用程序. 如果您的进程在它不在前台时已终止,则您的静态数据成员将是null您的活动从最近任务列表启动时。由于用户返回的活动不一定是您的启动器活动,因此您的应用程序可能会表现得好像静态数据成员自发转身null,即使这是因为您的进程已被终止并重新启动。

这是需要非常小心地使用静态数据成员的几个原因之一。

于 2013-11-06T23:16:04.557 回答
1

如果您将变量设为静态,以便您可以从应用程序中的任何位置访问它,而无需每次都创建该类的新实例,我相信这是单例模式的一个很好的候选者。

String userid = Global.getInstance().userid;
于 2013-11-06T23:18:00.780 回答