在类中实例化变量而不是onCreate()错误?

时间:2012-06-22 13:32:42

标签: android

Android中的这个构造有问题吗?

class A extends Activity {

private Object myObject = new Object();

@Override
protected void onCreate(Bundle savedInstanceState) {
    //myObject = new Object();
}

}

因为稍后某些时候我得到(有时候,不可重现)异常,因为myObject为null。我不知道是不是因为我必须在onCreate中初始化。

修改:其他详细信息:

  • myObject的实际类是List<Object>(其中Object是特定于域的类型)

  • 稍后在活动中我将myObject存储为“参数传递器”类的静态字段并启动其他活动(因为我避免实现Parcelable。如果这是好的或坏的做法不应该在这里讨论,除非这导致我的错误)。在另一个Activity中,我选择了myObject。它(有时)是空的。

编辑2 :我不明白为什么如果我将对它的引用存储为参数传递类的静态字段(一个独立的专用类),这个对象变为null。这就是垃圾收集的工作方式,对,它只是在不再引用对象时删除。因为我有一个静态引用,所以不应删除此对象。根据这个想法,如果它们是正确的,问题应该在其他地方。

3 个答案:

答案 0 :(得分:2)

当你开始一个新的活动时,你的旧活动会在块上进行可能的垃圾收集(包括在其中实例化的任何类,包括你的参数传递类),所以你的对象不一定可用(这就是你的原因)看到间歇性的失败。)。

我看到两个选项:

1)将您的意图传递给捆绑包,以启动新活动。当你试图避免这种情况时,可能不是你最好的选择。

2)扩展Application类并将对象存储在那里。

修改

我认为接受此SO Question的答案可能会解决您的问题(并解释实际发生的情况)。

答案 1 :(得分:1)

没有。那段代码很好。您可以在构造函数中创建对象。

答案 2 :(得分:0)

您可能需要查看之前关于它的问题Instance variable initialization in java以及基本上表明第一种情况的3.2.4. Field Defaults and Initializers部分:

  

private Object myObject = new Object();

与类构造函数中的初始化相同。 (注意onCreate不是构造函数)。

因此, myObject 永远不应该是 null ,除非“new Object()”指令失败,否则会产生异常。

您的代码是否可能在代码后面更改myObject的内容?