从Handler线程调用FindViewById - NullPointerException

时间:2014-01-12 01:05:09

标签: java android

所以,我试图在我的应用程序中实现一个简单的计时器,其中我每隔一秒递增一次MM:SS显示。

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game);


        handler = new Handler();
        Runnable runnable = new GameActivity();
        handler.postDelayed(runnable, 5000); //Start Incrementing timer after 5s.

    }

@Override
    public void run() {
        // TODO Auto-generated method stub
        TextView timeView = (TextView)findViewById(R.id.textView1);
        String time = (String) timeView.getText();

        if (TimerUtilities.convertMSToSeconds(time) < R.integer.TimeLimit) 
        {
            time = TimerUtilities.incrementOne(time);
            timeView.setText(time);
            timeView.postInvalidate();
            handler.postDelayed(new GameActivity(), 1000);
        }
        else
        {
            time = TimerUtilities.incrementOne(time);
            timeView.setText(time);            
        }               
    }

当我查看logcat输出时 - 我在重写的run方法的findViewById行中得到一个空指针异常。

因为从处理程序线程读取/更新UI,所以问题就出现了。如果是这样,我还有另一种方法吗?

1 个答案:

答案 0 :(得分:1)

正在为您创建的新GameActivity调用run方法。永远不会调用setContentView方法,因此它没有任何视图。你可能想打电话

handler.postDelayed(this, 5000);

而不是创建新活动。