更新主线程无效

时间:2014-11-23 12:54:42

标签: 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();
        }
    }

3 个答案:

答案 0 :(得分:2)

Thread是Android的main/UI主题,设置sleep(value)会导致主线程休眠或 在预定的时间内停止工作。如果您想暂时更新main UIsleep,最好创建一个新的thread,然后创建覆盖Runnable的{​​{1}}对象。在Run()内,您可以调用耗时的函数,也可以将您创建的新Run()设为thread,而不是强制sleep转换为UI thread这将导致所有主要sleep元素冻结。以下代码中的UI作为Handlerthread之间的中间人,您也可以将message queue替换为h1,将其作为消息发布到队列,然后更新您的视图。

请尝试以下代码:

tv_1

答案 1 :(得分:1)

UI线程上的Thread.sleep是一个坏主意。使用处理程序:

private Handler mHandler = new Handler():
private class MyRunnable implmenets Runanble {
   private final static int MAX_INT = 20;
   private int mCounter = 0;

         @Override
         public void run() {
         if (mCounter == 20) {
             mHandler.removeCallbacks(this);
             return; 
         }
         mytexts.setText(" " + mCounter);
         mCounter++;
         mHandler.postDelayed(this, 2000);
     }
}

并在您的创建中,在初始化视图后,请致电

mHandler.postDelayed(new MyRunnable(), 2000);

答案 2 :(得分:0)

也许这会成功:

for(int i = 0; i < 20; i++) {
  new Handler().postDelayed(new Runnable() {
  @Override
  public void run() {
  tv_t1.setText("t1:" + i);
  }
}, 2000);
}

是的,如果你在&#34; i&#34;的价值时出现延迟为0然后在循环外设置第一个文本并以i = 1开始循环或在循环中放入一个if-else块

希望它有所帮助。