Application类中的静态引用和引用之间的区别?

时间:2012-07-12 07:21:49

标签: android

假设我有一个类的实例的引用,它没有对有问题的对象(如上下文,视图......)的任何直接/间接引用。在静态引用中使用此引用并在扩展Application类的类中使用它是否有任何区别?

我的意思是,只有当进程被终止时(或者没有引用它时),引用的对象才会被释放,对吧?使用多个流程时可能存在差异吗?

2 个答案:

答案 0 :(得分:1)

稍有不同的是Garbage Collector将首先销毁Activities(或Services)中绑定的静态引用,以防出现严重内存不足的情况,如果它处于选择静态引用和Application类中的引用。出现这种情况是因为当Activity(或Service)被销毁时,它将保留静态变量而不引用(如果除了上面描述的那个之外没有其他引用),那么它们可以通过GC。即使VM重新初始化Activity(或Service),这些静态引用也将使初始值丢失可能已发生的任何更新。作为一般经验法则,如果您想确保静态变量是持久的:

  1. 不要从Activities(或Services)引用它们,因为如果内存不足,它们可能会被销毁。
  2. 从“活动”或“服务”中引用它们,但是处理它们被手动销毁的情况(例如,使用Android的onSavedInsanceState方法)就像使用非静态引用一样。
  3. 编辑以下是对此原因的解释:

      

    静态引用绑定到类的类加载器   首先初始化它们。这意味着如果是静态变量   任何类中的内部都已被一个活动初始化,当时   活动被破坏也可以卸载它的类,所以   变量变得未初始化。如果变量是初始化的   通过应用程序类,它的生命与应用程序相同   过程所以我们确信它永远不会再次未初始化。   这就是我选择初始化所有单身人士的原因   MyApplication类。

    在此link中找到。

答案 1 :(得分:0)

我相信@Angelo在其他答案中引用的article是非常错误的(至少可以说)并引起很多混淆:android中的类是基于每个进程而不是基于每个类卸载的。也就是说,如果您的应用程序被杀死并且类已卸载,则会丢失所有静态 - 如果不是。这就是我至少对@fadden的回答:

Is it still the case that Android never unloads classes?

Android: When do classes get unloaded by the system?

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