2014-12-04 85 views
0

我是Android新手。Runnable在方法中声明时有效;在方法外声明时崩溃

我想修改我的活动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

它不是'Runnable',它是'TextView'。 – 2014-12-04 01:18:10

+0

将TextView声明放入run()方法内确实可以解决问题!你能解释为什么另一种方式会破坏吗? – 2014-12-04 01:20:16

回答

0

我做错了什么?

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

其次,不要叫继承的方法对你Activity,像findViewById(),直到onCreate()内,通常在super.onCreate()调用之后。在onCreate()完成后调用onResume(),这就是为什么您的第一版存活得更好。

三,具体用findViewById(),你需要在小部件已经存在后调用它。直到setContentView()或设置您的用户界面的等效方式才会发生。

0

混合索蒂里奥斯Delimanolis'和CommonsWare的回应在这里:

logcat的揭示findViewByID()引起一个NullPointerException,因为它的onCreate之前称为()(与TextView的资源加载位置),一旦活动开始。