假设我有一个类的实例的引用,它没有对有问题的对象(如上下文,视图......)的任何直接/间接引用。在静态引用中使用此引用并在扩展Application
类的类中使用它是否有任何区别?
我的意思是,只有当进程被终止时(或者没有引用它时),引用的对象才会被释放,对吧?使用多个流程时可能存在差异吗?
答案 0 :(得分:1)
稍有不同的是Garbage Collector
将首先销毁Activities
(或Services
)中绑定的静态引用,以防出现严重内存不足的情况,如果它处于选择静态引用和Application
类中的引用。出现这种情况是因为当Activity
(或Service
)被销毁时,它将保留静态变量而不引用(如果除了上面描述的那个之外没有其他引用),那么它们可以通过GC。即使VM重新初始化Activity
(或Service
),这些静态引用也将使初始值丢失可能已发生的任何更新。作为一般经验法则,如果您想确保静态变量是持久的:
Activities
(或Services
)引用它们,因为如果内存不足,它们可能会被销毁。onSavedInsanceState
方法)就像使用非静态引用一样。编辑以下是对此原因的解释:
静态引用绑定到类的类加载器 首先初始化它们。这意味着如果是静态变量 任何类中的内部都已被一个活动初始化,当时 活动被破坏也可以卸载它的类,所以 变量变得未初始化。如果变量是初始化的 通过应用程序类,它的生命与应用程序相同 过程所以我们确信它永远不会再次未初始化。 这就是我选择初始化所有单身人士的原因 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?
现在你的问题有点模糊......静态引用与非静态引用不同,无论它在何处使用。如果你的意思是两个变量都是静态的,那么如果它们在一个活动,应用程序或任何实例中都没有区别 - 每当加载类并且变量取值时它们将保持不变,直到卸载类为止。不确定在卸载类时是否存在指定的顺序 - 或者这是否重要。