【发布时间】:2013-11-09 02:34:49
【问题描述】:
假设我有一个类实例的引用,它没有对有问题的对象(如上下文、视图、...)的任何直接/间接引用。在静态引用中使用此引用与在扩展Application 类的类中使用它有什么区别?
我的意思是,在这两种方式中,只有当进程被终止(或者没有对它的引用时)才会释放被引用的对象,对吧?使用多个进程可能会有区别?
【问题讨论】:
标签: android
假设我有一个类实例的引用,它没有对有问题的对象(如上下文、视图、...)的任何直接/间接引用。在静态引用中使用此引用与在扩展Application 类的类中使用它有什么区别?
我的意思是,在这两种方式中,只有当进程被终止(或者没有对它的引用时)才会释放被引用的对象,对吧?使用多个进程可能会有区别?
【问题讨论】:
标签: android
一个细微的区别是Garbage Collector 将首先销毁绑定在Activities(或Services)中的静态引用,以防内存严重不足,如果它是在静态引用和内部引用之间进行选择的情况下Application 班级。之所以会出现这种情况,是因为当Activity(或Service)被销毁时,它会留下没有引用的静态变量(如果它们除了上述引用之外没有其他引用),因此它们可以被GC收集。即使 VM 重新初始化 Activity(或 Service),这些静态引用也会采用初始值,丢失可能已经发生的任何更新。作为一般经验法则,如果您想确保静态变量是持久的:
Activities(或Services)引用它们,因为它们可能会在内存不足的情况下被破坏。onSavedInsanceState 方法),就像使用非静态引用一样。编辑以下解释为什么会发生这种情况:
静态引用绑定到类的类加载器 首先初始化它们。这意味着如果一个静态变量 在任何类内部都已由活动初始化,当 活动被破坏,它的类也可能被卸载,所以 变量变得未初始化。而如果变量被初始化 通过应用程序类,它的生命与应用程序相同 过程,所以我们确信它永远不会再次未初始化。 这就是为什么我选择初始化所有单例 MyApplication 类。
在这个link中找到。
【讨论】:
GC 是可能的在内存使用频繁时清除静态类中的静态引用。我找不到谷歌描述这个问题的更正式的文件。我刚刚提到了这个问题,因为我听到很多程序员抱怨有时会清除他们的静态引用,我发现记住这一点很有用。毕竟这有一个逻辑解释。
Activity 中有该引用,则该实例的生命周期取决于 Activity 的生命周期。
我相信@Angelo 在另一个答案中引用的article 是非常错误的(至少可以这么说)并引起了很多混乱:android 中的类是基于每个进程而不是基于每个类卸载的。也就是说,如果您的应用程序被杀死 并且 类被卸载,那么您将失去 所有 静态状态 - 如果不是。这就是我对@fadden 的回答的看法:
Is it still the case that Android never unloads classes?
Android: When do classes get unloaded by the system?
现在你的问题有点含糊......静态引用与非静态引用不同,无论它在哪里使用。如果您的意思是这两个变量都是静态的,那么它们在活动、应用程序或任何实例中都没有区别 - 每当加载类并且变量取某个值时,它们将保持不变,直到类被卸载。不确定在卸载类时是否有指定的顺序 - 或者这是否重要。
【讨论】: