Runnable在方法中声明时起作用;在方法之外声明时崩溃

时间:2014-12-04 01:16:48

标签: java android runnable

我是Android新手。

我想在几秒钟之后修改我的活动的TextView(它说"嘿嘿!"起初;我希望它说"你好!"之后几秒钟),所以我有:

protected void onResume() {
    super.onResume();

    final TextView t = (TextView)findViewById(R.id.hello);
    Runnable changeTextTask = new Runnable() {
        public void run() {
            t.setText("hello!");
        }
    };

    Handler h = new Handler();
    h.postDelayed(changeTextTask, 3000);
}

哪个有效。但是,当我在类的开头声明Runnable时,就像这样:

public class MainActivity extends ActionBarActivity {
    final TextView t = (TextView)findViewById(R.id.hello);
    Runnable changeTextTask = new Runnable() {
        public void run() {
            t.setText("hello!");
        }
    };

    .
    .
    .

    protected void onResume() {
        super.onResume();

        Handler h = new Handler();
        h.postDelayed(changeTextTask, 3000);
    }

应用程序在启动时崩溃。任何人都可以解释为什么会发生这种情况/我做错了什么?

2 个答案:

答案 0 :(得分:0)

  

我做错了什么?

首先,use LogCat检查崩溃的Java堆栈跟踪。

其次,不要在Activity上调用继承的方法,例如findViewById(),直到onCreate()内部,通常在super.onCreate()调用之后。在onResume()完成后调用onCreate(),这就是为什么您的第一版能够更好地存活下来。

第三,特别是findViewById(),你需要在小部件已经存在之后调用它。在setContentView()或设置用户界面的等效方法之前不会发生这种情况。

答案 1 :(得分:0)

混合Sotirios Delimanolis'和CommonsWare的回复:

LogCat显示findViewByID()导致NullPointerException,因为它在活动开始后在onCreate()(加载了TextView的资源)之前被调用。