4

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

class A extends Activity {

private Object myObject = new Object();

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

}

因为在稍后的某个时间点我得到(有时,还不能重现)异常,因为 myObject 为空。不知道是不是因为要在onCreate中初始化。

编辑:附加细节:

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

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

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

4

3 回答 3

2

当您开始一项新活动时,您的旧活动将进入可能的垃圾收集块(包括其中实例化的任何类,包括您的参数传递器类),因此您的对象不一定可用(这就是为什么您会看到间歇性失败。)。

我看到两个选项:

1) 将它与您启动新活动的意图一起传递到捆绑包中。当您试图避免这种情况时,可能不是您的最佳选择。

2)扩展Application类并将对象存储在其中。

编辑

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

于 2012-06-22T14:11:59.770 回答
1

不,那个代码很好。您可以在构造函数中创建对象。

于 2012-06-22T13:41:27.963 回答
0

您可能想查看关于它的上一个问题Instance variable initialization in java和第3.2.4 节。Field Defaults and Initializers基本上说明了第一种情况:

私有对象 myObject = new Object();

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

因此,myObject永远不应为null,除非“new Object()”指令失败并生成异常。

这难道不是您的代码稍后会在代码中更改 myObject 的内容吗?

于 2012-06-22T14:27:39.253 回答