2014-11-02 106 views
1

我想將文本設置爲25個按鈕,但每個文本在5秒後都會出現。我嘗試過使用很多不同的方法。我嘗試使用Thread.sleep(5000),但我的程序崩潰。然後我試圖創建一個Handler,但它崩潰了。有人可以告訴我爲什麼嗎?或者是有另一種方式,我應該推遲文本:Android延遲文本

*注意:在我的代碼中,我使用findViewById方法,但決定不要在這裏發佈它爲了簡單和重複的緣故 - 所以這不是問題。

public class Game extends Activity { 

protected List<String> my_list = new ArrayList<String>(); 
protected String letters[]; 
protected List<Button> button_list = new ArrayList<Button>(); 
Button b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, 
     b11, b12, b13, b14, b15, b16, b17, b18, b19, b20, 
     b21, b22, b23, b24; 

Random rand = new Random(); 
int random_counter; 
int my_list_counter = 25; 
int i; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.game_activity); 
    letters = new String[]{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", 
          "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", 
          "u", "v", "w", "x", "y"}; 
    Button[] bttn_arr = new Button[] {b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, 
      b11, b12, b13, b14, b15, b16, b17, b18, b19, b20, 
      b21, b22, b23, b24}; 


    my_list.addAll(Arrays.asList(letters)); 

    button_list.addAll(Arrays.asList(bttn_arr)); 

    final Handler handler = new Handler(); 
    handler.post(new Runnable() { 
     @Override 
     public void run() { 
      for (i=0; i<25; i++){ 
       random_counter = rand.nextInt(my_list_counter); 
       button_list.get(i).setText(my_list.get(random_counter)); 
       my_list.remove(my_list.get(random_counter)); 
       my_list_counter--; 
       handler.postDelayed(this, 5000); 
      } 
     } 
    }); 
} 

}

+0

**從來沒有**在UI線程中使用Thread.sleep。處理程序是要走的路。如果您的程序崩潰了,請查看您在控制檯中獲得的異常,可能是空指針異常或類似情況。順便說一下,你同時安排了25個電話到同一個可運行的,要小心,這可能會成倍地增長 – rupps 2014-11-02 05:05:46

+0

感謝您的建議。我仍然試圖找出問題所在。我正在實施Kaylwin的答案,但似乎仍然存在一個錯誤,因爲我在下面發佈。稍稍改變Kaylwin的代碼後,程序等待5秒鐘,然後顯示所有文本。它不會每隔5秒顯示每個文本... – user2456977 2014-11-02 14:49:22

回答

1

嘗試,而不是適應這樣的:

for (int i = 0; i < 20; i++) { 
     final String message = "Hello" + i; 
     Runnable x = new Runnable(){ 
      @Override 
      public void run(){ 
       Log.i("Hello", message); 

      } 
     }; 

     Handler handler = new Handler(); 
     //Run the code in runnable x at increasing time intervals of 5 seconds 
     handler.postAtTime(x, SystemClock.uptimeMillis() + i*5000); 

    } 

} 


這段代碼會打印出 「你好」 +我(例如,你好你好,然後hello3等)每5秒。如果你調整你的代碼,它將每5秒運行一次。在前面的例子中,處理程序一次性發布並運行所有可運行的子程序,現在它會一次發佈所有可運行子程序,除了每個人的開始時間增加5秒(請參閱handler.postAtTime(...))。希望這可以幫助!

+0

我使用了您的代碼,但似乎存在錯誤。我現在正在調試,看看我能否弄清楚。它在進入運行方法之前運行循環25次。 – user2456977 2014-11-02 14:36:51

+0

並在5秒後顯示所有文字。它不是一個接一個的。嗯...有什麼想法? – user2456977 2014-11-02 14:46:15

+0

@ user2456977我誤解了你的問題,所以我改變了我的答案,讓他們逐個顯示。 – 2014-11-02 19:22:28

0

使用處理器這樣

for(int i=0;i<25;i++){ 
final Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 

       //do something here 

      } 
     }, 5000); 
}