【问题标题】:static variables as global, and when are static objects garbage collected?静态变量作为全局变量,什么时候对静态对象进行垃圾回收?
【发布时间】:2013-07-02 06:40:01
【问题描述】:
我想在 android 应用程序的任何地方访问一个变量,即使我从未打开查看声明该变量的 Activity 类。是否可以使用静态变量。如果我在不同的活动之间移动,我可以访问这个变量来修改和更改它而不丢失更改吗?
我了解共享首选项和 sqlite 数据库可用于为此目的存储变量,但是我想知道我是否可以安全地为此使用静态。我唯一担心的是,如果由于某种原因,在应用程序仍在使用时,静态变量将在应用程序打开和使用时被垃圾收集。
我也不想创建应用程序类全局变量,而是想知道在应用程序的 java 或 android 类之一中使用静态变量。
【问题讨论】:
标签:
java
android
static
global
【解决方案1】:
加载类时,静态变量不能进行垃圾回收。它们可以在相应的类加载器丢弃类或本身被收集为垃圾时被收集。
【解决方案2】:
直到包含的类仍然加载在 JVM 中,静态变量才符合垃圾回收条件。此类变量由 ClassLoaders 引用的 Class 对象引用。 Tehy 只能在两种非常罕见的情况下进行垃圾收集,即 ClassLoader 以某种方式丢弃 Class 或 ClassLoader 本身符合收集条件。
更多详情来自JLS § 12.7:
一个类或接口可以被卸载当且仅当它的定义类
loader 可以由垃圾收集器回收,如
§12.6。引导加载程序加载的类和接口可能不会
被卸载。
【解决方案3】:
引用线程here:
静态字段作为一个整体附加到 Class 实例上,即
依次附加到加载类的 ClassLoader。
当整个 ClassLoader 被卸载时,the_instance 将被卸载
回收。我 90% 确定当 Android 破坏应用程序时会发生这种情况
(不是当它进入后台或暂停时,而是完全
关闭。)
根据您的需要,首先尝试使用全局变量,但我认为这里最好的方法是使用 SharedPreferences(只是我的意见),但这当然是如果它适合您的模型。
【解决方案4】:
是的,您可以使用静态变量,但不建议使用 - 不建议这样做,因为您的所有活动都必须具有对包含该静态变量的类的引用(这意味着您的代码将紧密耦合!)。
“正确”的做法是在活动之间传递变量或使用 sqlite——就像你提到的那样。
【解决方案5】:
创建一个类 AppConstants。然后将您的静态变量创建为:
公共静态字符串名称=“zz”;
然后访问 Appconstants.name 之类的任何地方