首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在线程和Runnable中更新TextView

在线程和Runnable中更新TextView
EN

Stack Overflow用户
提问于 2012-10-04 05:02:22
回答 4查看 69.7K关注 0票数 35

我想在安卓系统中做一个简单的计时器,每秒钟更新一个TextView。它只是简单的计算秒,就像扫雷。

问题是当我忽略tvTime.setText(...)(make it //tvTime.setText(...),在LogCat中,每秒将打印以下数字。但是当我想将这个数字设置为一个TextView (在另一个线程中创建)时,程序崩溃了。

有没有人知道如何轻松解决这个问题?

下面是代码(方法在启动时调用):

代码语言:javascript
复制
private void startTimerThread() {
    Thread th = new Thread(new Runnable() {
        private long startTime = System.currentTimeMillis();
        public void run() {
            while (gameState == GameState.Playing) {
                System.out.println((System.currentTimeMillis() - this.startTime) / 1000);
                tvTime.setText("" + ((System.currentTimeMillis() - this.startTime) / 1000));
                try {
                    Thread.sleep(1000);
                }
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    });
    th.start();
}

编辑:

终于,我明白了。对于那些对此感兴趣的人,这里有一个解决方案。

代码语言:javascript
复制
private void startTimerThread() {       
    Thread th = new Thread(new Runnable() {
        private long startTime = System.currentTimeMillis();
        public void run() {
            while (gameState == GameState.Playing) {                
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        tvTime.setText(""+((System.currentTimeMillis()-startTime)/1000));
                    }
                });
                try {
                    Thread.sleep(1000);
                } 
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    });
    th.start();
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-04 05:21:00

UserInterface只能由UI线程更新。您需要一个Handler,才能发布到UI线程:

代码语言:javascript
复制
private void startTimerThread() {
    Handler handler = new Handler();
    Runnable runnable = new Runnable() {
        private long startTime = System.currentTimeMillis();
        public void run() {
            while (gameState == GameState.Playing) {  
                try {
                    Thread.sleep(1000);
                }    
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
                handler.post(new Runnable(){
                    public void run() {
                       tvTime.setText("" + ((System.currentTimeMillis() - this.startTime) / 1000));
                }
            });
            }
        }
    };
    new Thread(runnable).start();
}
票数 54
EN

Stack Overflow用户

发布于 2012-10-04 05:23:50

或者,当您想要更新UI元素时,也可以在线程中执行此操作:

代码语言:javascript
复制
runOnUiThread(new Runnable() {
    public void run() {
        // Update UI elements
    }
});
票数 31
EN

Stack Overflow用户

发布于 2017-03-30 07:12:21

可以选择使用runOnUiThread()来更改主线程中的de views属性。

代码语言:javascript
复制
  runOnUiThread(new Runnable() {
        @Override
        public void run() {       
                textView.setText("Stackoverflow is cool!");
        }
    });
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12716850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档