Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 静态引用和应用程序类内部引用之间的区别?_Android - Fatal编程技术网

Android 静态引用和应用程序类内部引用之间的区别?

Android 静态引用和应用程序类内部引用之间的区别?,android,Android,假设我引用了一个类的实例,它没有任何直接/间接引用问题对象(如上下文、视图等)。在静态引用中使用此引用与在扩展应用程序类的类中使用它之间有什么区别吗 我的意思是,在这两种情况下,只有当进程被终止(或者没有对它的引用)时,引用的对象才会被释放,对吗?使用多个进程时可能会有差异?一个细微的差异是垃圾收集器将首先销毁绑定在活动中的静态引用(或服务)如果在静态引用和应用程序类中的引用之间进行选择,则内存严重不足。发生这种情况的原因是当活动(或服务)被销毁时,静态变量将没有引用(如果它们除了上述引用之外没

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


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

一个细微的差异是
垃圾收集器将首先销毁绑定在
活动中的静态引用(或
服务
)如果在静态引用和
应用程序
类中的引用之间进行选择,则内存严重不足。发生这种情况的原因是当
活动
(或
服务
)被销毁时,静态变量将没有引用(如果它们除了上述引用之外没有其他引用),因此GC可以收集它们。即使虚拟机重新初始化
活动
(或
服务
),这些静态引用也将采用初始值,从而丢失可能已发生的任何更新。一般来说,如果您想确保静态变量是持久的,请执行以下操作:

  • 不要从
    活动
    (或
    服务
    )中引用它们,因为它们有可能在内存不足的情况下被销毁
  • 从活动或服务中引用它们,但手动处理它们被销毁的情况(例如,使用Android的
    onSavedInsanceState
    方法),就像处理非静态引用一样
  • 编辑以下是发生这种情况的原因解释:

    静态引用绑定到类的类加载器 这首先初始化了它们。这意味着如果一个静态变量 在任何类中,当 活动被销毁,其类也可能被卸载,因此 变量变得未初始化。而如果变量已初始化 通过应用程序类,它的生命周期与应用程序相同 所以我们确信它永远不会再次被取消初始化。 这就是为什么我选择初始化 我的应用程序类

    发现于此。

    我相信@Angelo在另一个答案中引用的答案是非常错误的(至少可以说),并且造成了很多混乱:android中的类是基于每个进程而不是基于每个类卸载的。也就是说,如果你的应用程序被终止,类被卸载,你将失去所有静态状态——如果不是,则为否。这就是我对@fadden答案的理解,至少:


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

    真的吗?你能给我一个你在哪里读到的链接吗?还有,为什么会发生这种情况?我明白了,这不是和它在java“世界”上的工作方式完全相反吗。如果类的java文件具有静态引用怎么办?我的意思是,如果它不是在活动类中,而是独立的?这种引用是否也可能为空?也,关于这个问题,谷歌有没有更正式的文本?我不能给出一个明确的答案,但我相信我的答案中描述的行为会发生,因为应用程序上下文引用的生命周期与应用程序的生命周期相同,但是,
    GC
    可以在发生错误时清除静态类中的静态引用强烈的记忆用法。我找不到比谷歌更正式的文件来描述这个问题。我刚刚提到这个问题,因为我听到很多程序员抱怨有时会清除静态引用,我发现记住这一点很有用。毕竟,这是一个逻辑解释。我不是指静态类。我指的是与android无关的普通公共类,例如,一个内部有int的类。如果在这个类中我有一个对同一个类实例的引用,那么同样的奇怪规则也会对它起作用(这意味着该引用在某个点上可能为null)?我认为这是一个不同的问题,我不确定相同的规则是否适用,因为您将拥有该类的实例,并且该类引用的位置定义了该实例的生命周期,换句话说,该类的实例取决于持有该引用的实例或静态类。例如,如果在
    活动
    中有该引用,则该实例的生命周期取决于
    活动
    的生命周期。不,我的问题基于这样一个事实,即您可以从“应用程序”类进行扩展,并将变量放在那里,而不是将它们放在静态引用中。之所以有可能,是因为这个类只有一个真实的实例,它为一个进程而存在,直到进程被终止,就像静态引用一样。@androiddeveloper:“这个类只有一个真实的(??)实例,它为一个进程而存在,直到进程被终止。”-->我对这一点非常不确定,我继续了下去,只有一次在发生其他事情后调用了onCreate应用程序(我想是广播接收器的问题,但我不确定)。然而,据我所知,每个进程只有一个应用程序类的实际实例。我所说的“真实”是指,既然你总能做到“新”