有相当一段时间,我很高兴地认为,只要应用程序运行,静态实例变量就存在。然而,令我惊愕和惊慌的是,我觉得这不是真的。
仅仅为了测试,我创建了一个字符串的静态列表,并且在我的主activity
类中,重写了onDestroy
方法来打印一条消息来验证应用程序是否退出。在onCreate
方法中,我只是添加了一个新的string
,并打印了列表的内容。我发现列表的大小不断增加,前面添加的所有字符串值仍然存在。
我甚至在这里读过一些地方,以便实例变量与应用程序一样存在,但我担心情况并非如此。
更准确地说,我在为Android使用Facebook时意识到了这个问题。我已经看到,AuthListener
类中侦听器列表中的SessionEvents
实例随着时间的推移而不断增加。因此,每当应用程序启动,用户登录使用FB时,侦听器方法就会被触发的次数与SessionEvents
类中存在的实例一样多。
以前有没有人注意到这一点,我是否在理解android的工作方式上犯了什么重大错误?
什么给的?
谢谢你的阅读!
更新
我被BalusC
和rdineiu
纠正了。我真的不是有意在这里制造一个关于实例和类变量的混乱。唉,在我急于提出我的问题时,我犯了一个我不希望犯的错误。我非常清楚static
和instance
变量之间的区别。我只是打算编写class
变量,但不太清楚如何将静态变量称为instance
变量。
不过,我的问题仍然存在。@MisterSquonk --不,我不想混淆我的Activity
何时结束以及应用程序何时被破坏。下面是我在一个示例中尝试的--我只有一个Activity
作为Main
。当我按下这个Activity
的后退按钮时,我假设Activity
从堆栈中移除,而应用程序也被销毁。我已经启动了任务管理器来验证我的应用程序不再运行。
发布于 2011-06-15 10:08:24
因此,我发布了同样的问题,不幸的是,在安卓开发者Google组中,我犯了同样的错误,将static
变量命名为instance
变量。
我收到了一些非常好的答复,尤其是来自Kostya的回复。我在这个小组的互动帮助我掌握了Android平台的基本“规则”。
希望消息线程也能帮助你。
发布于 2011-05-28 11:20:23
您似乎没有区分静态变量和实例变量。静态变量是在类本身上定义的。实例变量仅存在于类实例中。
示例:
class Test {
public static int a;
}
变量a
是在类本身定义的,而不是在类的实例上定义的。每个实例都将访问同一个变量。如果一个实例将a
的值设置为5
,则其他每个实例都会将该值视为5
。一旦实例消失,变量就不会消失,因为它与任何实例(它是一个类变量)根本没有关联。它将继续存在,直到时间结束(或直到应用程序退出,两者以第一位为准)。
另一方面,下面的示例使用实例变量:
class Test {
public int a;
}
这个变量只能从类的实例中访问。每个实例都有一个不同的变量副本。一旦实例被销毁,变量就会与它一起运行。
为了说明:
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]
}
}
发布于 2011-05-28 11:21:02
当应用程序销毁实例变量时,一些gui部件默认保存状态,然后在onCreate方法中恢复状态。
https://stackoverflow.com/questions/6163828
复制