【问题标题】:Android: modifying an XML element in a timerAndroid:在计时器中修改 XML 元素
【发布时间】:2010-12-04 01:14:51
【问题描述】:

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

我在班级的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() 方法中。有谁知道解决办法吗?

【问题讨论】:

    标签: android xml textview timertask


    【解决方案1】:

    你可以用一个处理程序来做,有点像这样:

    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】:

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

    public void run()
    

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

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

    【讨论】:

    • 谢谢。我不知道该怎么做,请问您有教程或示例吗?那会有很大帮助。谢谢!
    • 那么“新的 TimerTask”应该是一个新的线程,请执行 .setText() 吗?
    • 我确实将整个代码放在了我创建的新线程的运行方法中。那仍然崩溃。
    • 您很可能希望将 UI 对象的控制权留给主线程。不要让计时器线程控制它们。线程非常适合您上面的任务。您只需将消息返回到主线程即可更新 textview。
    • 非常感谢!非常有用。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 2019-09-11
      • 1970-01-01
      相关资源
      最近更新 更多