2015-05-29 72 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);