假设我有一个类实例的引用,它没有对有问题的对象(如上下文、视图等)的任何直接/间接引用。在静态引用中使用这个引用和在扩展类的类中使用它有什么区别Application
吗?
我的意思是,在这两种方式中,只有当进程被终止时(或者没有对它的引用),被引用的对象才会被释放,对吧?使用多个进程时可能会有所不同?
假设我有一个类实例的引用,它没有对有问题的对象(如上下文、视图等)的任何直接/间接引用。在静态引用中使用这个引用和在扩展类的类中使用它有什么区别Application
吗?
我的意思是,在这两种方式中,只有当进程被终止时(或者没有对它的引用),被引用的对象才会被释放,对吧?使用多个进程时可能会有所不同?
一个细微的区别是,如果在静态引用和类内的引用之间进行选择的情况下,Garbage Collector
将首先销毁绑定在Activities
(or ) 中的静态引用,以防内存严重不足。出现这种情况是因为当(or ) 被销毁时,它会留下没有引用的静态变量(如果它们除了上述引用之外没有其他引用),因此它们可以被 GC 收集。即使 VM 重新初始化(or ),这些静态引用也将采用初始值,丢失任何可能发生的更新。作为一般经验法则,如果您想确保静态变量是持久的:Services
Application
Activity
Service
Activity
Service
Activities
(或Services
)引用它们,因为在内存不足的情况下它们可能会被破坏。onSavedInsanceState
Android 的方法),就像使用非静态引用一样。编辑这是对为什么会发生这种情况的解释:
静态引用绑定到首先初始化它们的类的类加载器。这意味着,如果任何类中的静态变量已由活动初始化,则当该活动被销毁时,其类也可能被卸载,因此该变量未初始化。而如果变量由应用程序类初始化,它的生命与应用程序进程相同,因此我们确信它永远不会再次未初始化。这就是为什么我选择初始化 MyApplication 类中的所有单例。
在此链接中找到。
我相信@Angelo 在另一个答案中引用的文章是非常错误的(至少可以说)并且引起了很多混乱:android 中的类是基于每个进程而不是基于每个类卸载的。也就是说,如果您的应用程序被终止并且类被卸载,那么您将失去所有静态状态——如果不是的话。这就是我对@fadden 的回答的看法,至少:
现在你的问题有点含糊......静态引用与使用它的非静态引用不同。如果您的意思是这两个变量都是静态的,那么它们在活动、应用程序或任何实例中都没有区别 - 每当加载类并且变量取某个值时,它们将保持不变,直到类被卸载。不确定卸载类是否有指定的顺序 - 或者这是否重要。