【问题标题】: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 之类的任何地方

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-08-08
            • 1970-01-01
            • 2023-03-22
            • 1970-01-01
            • 2015-03-26
            • 1970-01-01
            • 2016-02-01
            • 2010-09-25
            相关资源
            最近更新 更多