java - 更新主线程不起作用

标签 java android multithreading thread-safety runnable

我只想在延迟 2 秒的循环中显示每次迭代的值。

当我运行代码时,主线程卡住,一段时间后只显示 tv_t1: 19 的值。

任何人都可以让我知道下面发布的代码中有什么错误或我遗漏了什么吗?

注意:

我想在主线程上这样做。

*代码

tv_t1 = (TextView) findViewById(R.id.tv_t1);
    tv_t2 = (TextView) findViewById(R.id.tv_t2);

    for(int i = 0; i < 20; i++) {
        tv_t1.setText("t1:" + i);
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

最佳答案

Thread是Android的main/UI线程,设置sleep(value)会导致主线程 hibernate 或 在预定的时间停止工作。如果你想更新main UIsleep一段时间,最好创建一个新的thread然后创建Runnable 覆盖 Run() 的对象。在 Run() 中,您可以调用耗时的函数,也可以让您创建的新 thread 进入 sleep 而不是强制UI threadsleep,这将导致所有主要的 UI 元素卡住。下面代码中的Handler作为threadmessage queue的中间层,你也可以替换h1使用您的 tv_1 将其作为消息发布到队列中,然后更新您的 View 。

请尝试下面的代码:

Handler h1 = new Handler();
Thread t1;

t1 = new Thread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            try {
                loop();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
    t1.start();


    protected void loop() throws InterruptedException {
    // TODO Auto-generated method stub
     for (i = 0; i < 20; i++) {
         t1.sleep(2000);
         h1.post(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                tv_t1.setText("tv_1: " + i);
            }
        });
     }
}

关于java - 更新主线程不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27089181/

相关文章:

java - join() 不会阻塞其他线程(主线程除外)?

android - Android 的 runOnUiThread() 方法

java - 如何从通用集合中获取流?

java - 及格类<?扩展 T> 作为参数

删除尾随逗号期间正则表达式模式中的 Java 语法错误

java - 并行运行长作业,并且仅在所有作业完成后更新 UI

android - 在 fragment 中使用资源

java - 无法使用录制的 mp3 作为 google 语音转文本 api 的输入..!

android - 以编程方式更改主启动器 Activity

JAVA SocketServer 带框架