2015-05-29 106 views
1

我有一个textview,我想改变一个线程并一次又一次地执行(像数字时钟一样)。但我在两次更改之间设置时间时遇到问题。在这里,代码:Android-使用线程更新UI元素

display1 = (TextView) findViewById(R.id.textView1); 

Thread timer2 = new Thread(){ 
     @Override 
     public void run() { 
      synchronized (this){ 

       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         int i = 0; 
         display1.setText("" + i); 
         try { 
          sleep(2000); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 
         display1.setText("" + (i+1)); 
        } 
       }); 
      } 
     } 
    }; 

    timer2.start(); 

This sleep(2000);函数使textview在给定时间内不可见,但我希望它静止不动,直到下一次更改。我怎样才能做到这一点?

+3

UI线程上的Thread.sleep =非常糟糕的主意。 – Wildcopper

回答

2

,但我有与设置2之间的时间问题变化

不要在你的UI线程做sleep()。如果你想链的一些行动与延迟,拆你的代码为两个可运行,第一个应该设置display1再交第二可运行使用postDelayed()

编辑

想要的一个延迟他们增加3%秒,每秒其余5,直到他们达到1000例如

你可以让你的Runnable职位本身,直到某些条件得到满足(即时间,计数器值等)。只是在最后你的Runnable检查你的条件,如果不符合,请致电postDelayed(this, delay);,你很好。

+0

好的这个解决方案有点不错,但我想澄清我的意图。事实上,我有2个textviews。它们在初始化时为0。我想让他们中的一个每秒增加3点,另外每秒5点,直到他们达到1000点。所以我需要循环,我该如何实现?因为它也给变量赋予最终的错误(在for循环中使用可运行线程时)。而且对于java来说有一点新意,你能否写下我应该怎么做? –

+0

查看编辑答案 –

-1

也许把你需要做的事情分解成单独的方法。这里你有一个UI方法和一个睡眠方法分离。希望它有帮助

private void myMethod() { 
    new Thread() { 
     @Override 
     public void run() { 
      int i = 0; 
      doWorkOnUI(String.valueOf(i)); 
      pause(2000); 
      doWorkOnUI(String.valueOf(i++)); 
     } 
    }.start(); 
} 

private void pause(int pauseTime) { 
    try { 
     Thread.sleep(pauseTime); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

private void doWorkOnUI(final String string) { 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      display1.setText(string); 
     } 
    }); 
} 
0

您应该使用Handler来代替并将更改发送到UI线程。

Handler mHandler = new Handler(); 

mHandler.post(new Runnable() { 
    @Override 
    public void run() { 
     // Code to be run right away 
    } 
}); 

mHandler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     // Code to be run after 2 seconds 
    } 
}, 2000);