在onCreate()
或之前初始化这些变量是否更好?例如,是这样的:
public class Farts extends Activity {
private List<String> mFartHistory = new ArrayList<String>(R.array.fart_history);
private ListView mFartView = (ListView)findViewById(R.id.fart_view);
protected void onCreate(Bundle savedInstanceState) {
// blablablalbalblabal
}
}
或者这个:
public class Farts extends Activity {
private List<String> mFartHistory;
private ListView mFartView;
protected void onCreate (Bundle savedPoopooState) {
mFartHistory = new ArrayList<String>(R.array.fart_history);
mFartView = (ListView)findViewById(R.id.fart_view);
// blablbalablbabalal
}
}
更好的做法?
或者甚至重要,它只是一种偏好或什么?
答案 0 :(得分:1)
作为一般规则,您只能在Activity
或更高版本中调用超类Context
的方法,包括任何onCreate()
方法。
例如,findViewById()
之前调用onCreate()
将因NullPointerException
而失败。
因此后一种形式是优选的。
对于不需要调用活动方法的初始化,在何处执行它并不重要。
我了解您发布的代码是示例,但请记得致电super.onCreate()
,并在setContentView()
之前致电findViewById()
。
答案 1 :(得分:1)
让我们举个例子:
private List<String> mFartHistory = new ArrayList<String>(R.array.fart_history);
private ListView mFartView = (ListView)findViewById(R.id.fart_view);
如果您尝试以这种方式进行初始化,结果将是:
mFartHistory --> ArrayList
mFartView --> NullPointerException
为什么呢?因为上面的代码是在创建对象时执行的。因此List
将被正确初始化,但调用findViewById
(在创建对象时)的结果将抛出NullPointerException
。这是因为此方法搜索活动的布局,但尚未设置内容布局。因此,必须在调用ListView
之后完成setContentView(R.layout.activity_main)
的分配。
因此,结论是您必须在设置内容后指定View
字段,否则它们将保留null
。
现在谈谈你的问题:哪个更好。没有更好或更坏。这取决于您的代码风格。当我们讨论onCreate
类时,我更喜欢在Activity
方法中完成所有分配。如果它是POJO,我更喜欢在构造函数中执行此操作。
答案 2 :(得分:1)
忘记更好的做法在这两种情况下你的应用程序都会崩溃。您将NullPointerException
获得ListView
。因为在致电super.onCreate(savedPoopooState);
之前,您没有致电setContentView(R.layout.ur_layout_name)
并且未使用setContentView(anyView)
或findViewById
。你必须这样做
public class Farts extends Activity {
private List<String> mFartHistory;
private ListView mFartView;
protected void onCreate (Bundle savedPoopooState) {
super.onCreate(savedPoopooState);
setContentView(R.layout.ur_layout_name);//layout which consists that listview
mFartHistory = new ArrayList<String>(R.array.fart_history);
mFartView = (ListView)findViewById(R.id.fart_view);
// blablbalablbabalal
}
}
或者您可以通过编程方式将ListView
和 setContentView(listView)创建为Activity
忘记你的第一个案子。在setContentView(R.layout.ur_layout_name)
之前调用findViewById()时肯定会崩溃