Android:修改计时器中的XML元素

时间:2010-12-04 01:14:51

标签: android xml textview timertask

我想要一个计数器(计数秒和分钟)并每秒在显示器上更新它。

我在我班级的onCreate中有此代码,该代码扩展为Activity

timeOnCall = (TextView) findViewById(R.id.time);
minutes = seconds = 0;
timeOnCall.setText(minutes + ":" + seconds);

// Implements the timer
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    public void run() {
        ++seconds;
        if (seconds == 60) {
            seconds = 0;
            ++minutes;
        }
        // Display the new time
        timeOnCall.setText(minutes + ":" + seconds);
    }
}, 1000, 1000);

不幸的是,我收到以下错误:

android.view.ViewRoot$CalledFromWrongThreadException:只有创建视图层次结构的原始thread才能触及其视图。

我不知道如何修复它,因为它已经在onCreate()方法中。有谁知道解决方案?

3 个答案:

答案 0 :(得分:0)

这是因为您尝试从不同的线程内部更改textview。你不能这样做。您需要将消息发回给拥有textview的线程。

public void run()

这将启动一个与运行UI的新线程分开。

编辑:您正在寻找的代码在线有大量示例。只是谷歌的类似“Android线程消息处理程序。”

答案 1 :(得分:0)

你可以用一个处理程序来完成它,简单来说就是这个:

final Handler mHandler = new Handler();
final Runnable updateText = new Runnable() {
    public void run() {
        timeOnCall.setText(minutes + ":" + seconds);
    }
};

在onCreate中,您可以运行:

onCreate(Bundle b) {
...
    Timer timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
        public void run() {
            ++seconds;
            if (seconds == 60) {
                seconds = 0;
                ++minutes;
            }

            // Display the new time
        mHandler.post(updateText);
        }
    }, 1000, 1000);
}

答案 2 :(得分:0)

以下是您正在尝试执行的操作的完整步骤,并且在没有后台线程的情况下执行此操作。这比计时器更受欢迎,因为计时器使用单独的线程来执行更新。

http://developer.android.com/resources/articles/timed-ui-updates.html