2011-05-28 43 views
4

相当长的一段时间,我非常幸福,只要应用程序运行,静态[实例]变量就存在。然而,令我感到沮丧,并且非常惊慌,我觉得这不是真的。静态(类)变量的生存期

仅用于测试,我创建了一个静态的字符串列表,并在我的主activity类中覆盖了onDestroy方法来打印消息以验证应用程序已退出。在onCreate方法中,我简单地添加了一个新的string,并打印了列表中的内容。我发现的是,列表的大小不断增加,以前添加的所有字符串值仍然存在。

我读过的地方[甚至在这里]实例变量存在,只要应用程序,但我担心它不是真的如此。

更准确地说,我在使用Facebook SDK for Android时意识到了这个问题。我已经看到SessionEvents类中听众列表中的AuthListener实例随着时间的推移而不断增加。因此,无论何时启动应用程序并且用户使用FB登录,监听器方法都会触发多次,因为SessionEvents类中存在实例。

有人曾经观察过这个,有没有一些主要的错误,我承诺了解Android的工作原理?

是什么给出的?

感谢您的阅读!

[UPDATE]
我支持BalusCrdineiu校正。我真的不想在这里对实例和类变量产生困惑。唉,我急于发布我的问题,我犯了一个我不想做的错误。我非常清楚staticinstance变量之间的差异。我只是打算编写class变量,并且不能完全弄清楚将静态变量引用为instance变量。

但是,我的问题依然存在。 @MisterSquonk - 不,我不会在这里混淆关于何时我的Activity结束以及应用程序被破坏的情况。以下是我在示例中尝试的内容 - 我只有一个Activity,它的作用是Main。当我按下这个Activity的后退按钮时,我假设Activity从堆栈中被移除,该应用也被破坏。我已经启动了任务管理器来验证我的应用程序不再运行。

+6

静态变量!=实例变量 – BalusC 2011-05-28 19:23:23

+2

与您的问题没有直接关系,而是参考您所说的内容......“在我的主要活动类中,覆盖了onDestroy方法以打印消息以验证应用程序已退出” - Don'不要将活动与应用程序混淆。杀死活动并不一定会杀死应用程序(“应用程序”)。 – Squonk 2011-05-28 19:48:40

+0

@MisterSquonk - 不,我没有任何混淆。在我的特定应用程序中,我非常肯定,“活动”的杀死也意味着应用程序不再运行。我使用任务管理器对其进行了验证,并且更新了帖子以提及相同的内容。 – anirvan 2011-05-28 20:28:12

回答

5

所以 - 我在Android开发人员Google小组上发布了同样的问题[不幸在static变量中声明了static变量为instance变量]。

我收到了一些非常好的回复,特别是从Kostya。我在该团队的互动帮助我掌握了Android平台的基本“规则”。

希望message thread可以帮助你。

6

你似乎没有区分静态变量和实例变量。静态变量在类本身上定义。实例变量仅存在于类实例中。

实施例:

class Test { 
    public static int a; 
} 

可变a被限定在类本身,而不是在类的实例。每个实例将访问相同的变量。如果有一个实例将a的值设置为5,则每个其他实例的值都将显示为5。一旦实例消失,该变量不会消失,因为它不会与任何实例绑定(它是类变量)。它会一直持续到时间结束(或者直到申请退出,以先到者为准)。

在另一方面,下面的例子使用一个实例变量:

class Test { 
    public int a; 
} 

此变量将被访问只能从实例的类的。每个实例都有一个不同的变量副本。一旦实例被破坏,变量就会随之消失。


举例说明:当应用程序做但有些GUI小默认保存其状态,然后它onCreate方法恢复

import java.util.List; 
import java.util.ArrayList; 

class Test { 
    // instanceVar will be initialized whenever a new Test object is created 
    private List<Integer> instanceVar = new ArrayList<Integer>(); 

    // staticVar will be initialized right now 
    private static List<Integer> staticVar = new ArrayList<Integer>(); 

    public void updateInstanceVar() { 
    instanceVar.add(1); 
    instanceVar.add(2); 
    } 

    public void updateStaticVar() { 
    staticVar.add(1); 
    staticVar.add(2); 
    } 

    public static void main(String[] args) { 
    Test test1 = new Test(); 
    test1.updateInstanceVar(); // test1.instanceVar = [1, 2] 
    test1.updateStaticVar(); // Test.staticVar = [1, 2] 

    Test test2 = new Test(); 
    test2.updateInstanceVar(); // test2.instanceVar = [1, 2] 
    test2.updateStaticVar(); // Test.staticVar = [1, 2, 1, 2] 
    } 
} 
+0

谢谢你指出,是的 - 你是绝对正确的。然而,正如我对帖子的更新所表明的,我希望我的问题的意图不会因为我犯下的愚蠢错误而丢失。 – anirvan 2011-05-28 20:26:39

0

实例变量被破坏。