1

我想在 android 应用程序的任何地方访问一个变量,即使我从未打开查看声明该变量的 Activity 类。静态变量是否可以用于此。如果我在不同的活动之间移动,我可以访问这个变量来修改和更改它而不会丢失更改吗?

我知道共享首选项和 sqlite 数据库可用于为此目的存储变量,但是我想知道我是否可以安全地为此使用静态。我唯一担心的是,如果由于某种原因,在应用程序仍在使用时,静态变量将在应用程序打开和使用时被垃圾收集。

我也不想创建应用程序类全局变量,而是想知道在应用程序的 java 或 android 类之一中使用静态变量。

4

5 回答 5

1

加载类时,静态变量不能进行垃圾回收。当相应的类加载器丢弃类或本身被收集为垃圾时,可以收集它们。

于 2013-07-02T06:42:18.293 回答
0

在包含类仍然加载到 JVM 中之前,静态变量不符合垃圾收集条件。此类变量由 ClassLoaders 引用的 Class 对象引用。Tehy 只能在两种非常罕见的情况下被垃圾收集,如果 ClassLoader 以某种方式丢弃 Class 或者 ClassLoader 本身符合收集条件。

JLS § 12.7中的更多详细信息:

当且仅当其定义的类加载器可以被垃圾收集器回收时,类或接口才能被卸载,如第 12.6 节中所讨论的。引导加载程序加载的类和接口可能不会被卸载。

于 2013-07-02T06:43:38.363 回答
0

引用这里的线程:

静态字段作为一个整体附加到 Class 实例,该实例又附加到加载该类的 ClassLoader。当整个 ClassLoader 被回收时,the_instance 将被卸载。我有 90% 的把握当 Android 破坏应用程序时会发生这种情况(而不是当它进入后台或暂停时,而是完全关闭时。)

根据您的需要,首先尝试使用全局变量,但我认为这里最好的方法是使用 SharedPreferences (只是我的意见),但这当然是如果它适合您的模型。

于 2013-07-02T06:43:53.570 回答
0

是的,您可以使用静态变量,但不建议使用 - 因为您的所有活动都必须具有包含该静态变量的类的引用(这意味着您的代码将紧密耦合!)。

做到这一点的“正确”方法是在活动之间传递变量或使用 sqlite - 就像你提到的那样。

于 2013-07-02T06:44:11.590 回答
0

创建一个类 AppConstants。然后将您的静态变量创建为: public static String name="zz"; 然后访问像 Appconstants.name 这样的任何地方

于 2013-07-02T06:46:27.927 回答