2014-12-04 106 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的資源加載位置),一旦活動開始。