1

假设我有一个类实例的引用,它没有对有问题的对象(如上下文、视图等)的任何直接/间接引用。在静态引用中使用这个引用和在扩展类的类中使用它有什么区别Application吗?

我的意思是,在这两种方式中,只有当进程被终止时(或者没有对它的引用),被引用的对象才会被释放,对吧?使用多个进程时可能会有所不同?

4

2 回答 2

1

一个细微的区别是,如果在静态引用和类内的引用之间进行选择的情况下,Garbage Collector将首先销毁绑定在Activities(or ) 中的静态引用,以防内存严重不足。出现这种情况是因为当(or ) 被销毁时,它会留下没有引用的静态变量(如果它们除了上述引用之外没有其他引用),因此它们可以被 GC 收集。即使 VM 重新初始化(or ),这些静态引用也将采用初始值,丢失任何可能发生的更新。作为一般经验法则,如果您想确保静态变量是持久的:ServicesApplicationActivityServiceActivityService

  1. 不要从Activities(或Services)引用它们,因为在内存不足的情况下它们可能会被破坏。
  2. 从活动或服务中引用它们,但处理它们被手动销毁的情况(例如,使用onSavedInsanceStateAndroid 的方法),就像使用非静态引用一样。

编辑这是对为什么会发生这种情况的解释:

静态引用绑定到首先初始化它们的类的类加载器。这意味着,如果任何类中的静态变量已由活动初始化,则当该活动被销毁时,其类也可能被卸载,因此该变量未初始化。而如果变量由应用程序类初始化,它的生命与应用程序进程相同,因此我们确信它永远不会再次未初始化。这就是为什么我选择初始化 MyApplication 类中的所有单例。

在此链接中找到。

于 2012-07-12T07:26:43.250 回答
0

我相信@Angelo 在另一个答案中引用的文章是非常错误的(至少可以说)并且引起了很多混乱:android 中的类是基于每个进程而不是基于每个类卸载的。也就是说,如果您的应用程序被终止并且类被卸载,那么您将失去所有静态状态——如果不是的话。这就是我对@fadden 的回答的看法,至少:

Android 从不卸载类的情况仍然如此吗?

Android:系统何时卸载类?

现在你的问题有点含糊......静态引用与使用它的非静态引用不同。如果您的意思是这两个变量都是静态的,那么它们在活动、应用程序或任何实例中都没有区别 - 每当加载类并且变量取某个值时,它们将保持不变,直到类被卸载。不确定卸载类是否有指定的顺序 - 或者这是否重要。

于 2013-11-08T18:34:49.313 回答