0

我正在尝试有一个计数器(计数秒和分钟)并每秒在显示屏上更新它。

我的班级中有这段代码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()方法中了。有谁知道解决方案?

4

3 回答 3

0

这是因为您试图从不同的线程中更改文本视图。你不能那样做。您需要将消息发回拥有 textview 的线程。

public void run()

这会启动一个新线程,该线程与运行您的 UI 的线程是分开的。

编辑:您正在寻找的代码在线有大量示例。只需在 Google 上搜索类似“Android 线程消息处理程序”之类的内容。

于 2010-12-04T01:19:57.690 回答
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);
}
于 2010-12-04T01:39:10.410 回答
0

这是您尝试执行的操作以及在没有后台线程的情况下执行此操作的完整分步说明。这优于计时器,因为计时器使用单独的线程进行更新。

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

于 2010-12-04T01:56:21.880 回答