初始化活动范围的成员变量的哪种方法更好?

时间:2014-11-07 10:44:20

标签: android

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
    }
}

更好的做法?

或者甚至重要,它只是一种偏好或什么?

3 个答案:

答案 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()时肯定会崩溃