2014-12-04 129 views
0

Runnable的我想是我的程序運行的時候,所以我把它放在一個while(true)循環每5秒執行我run方法。問題是我的應用程序不會運行,因爲這個循環是while。有人可以請解釋如何正確編碼這個循環,所以它會一直運行?在while循環

這裏是我的代碼:

int i=0;  
while(true){ 
    Runnable x = new Runnable(){ 
     @Override 
     public void run(){ 
      if(my_list_counter <= 0) 
       return; 
      random_counter = rand.nextInt(my_list_counter); 
      make_words_with_letters.add(list_of_letters.get(random_counter)); 
      for(Button b:button_list) 
       if (b.getText().equals("")){ 
        b.setText(list_of_letters.get(random_counter)); 
        list_of_letters.remove(list_of_letters.get(random_counter)); 
        my_list_counter--; 
        break; 
       } 

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

} 

顯然這裏的錯誤是,Runnable需要到達終點開始運行。但是,因爲它在while(true)循環中,所以它永遠不會開始運行。 有人知道如何解決這個問題嗎?

編輯:新代碼感謝JavaHunter,但仍然有一個錯誤:

int i=0;  

    Runnable x = new Runnable(){ 
     @Override 
     public void run(){ 
      while(true){ 
       if(my_list_counter <= 0) 
        return; 
       random_counter = rand.nextInt(my_list_counter); 
       make_words_with_letters.add(list_of_letters.get(random_counter)); 
       for(Button b:button_list) 
        if (b.getText().equals("")){ 
         b.setText(list_of_letters.get(random_counter)); 
         list_of_letters.remove(list_of_letters.get(random_counter)); 
         my_list_counter--; 
         break; 
        } 

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

但這代碼只是凍結我的申請。這裏是logcat的:

enter image description here

它顯示了一些關於GC被封鎖,但我不知道到底是什麼意思。有人可以幫忙嗎?

+0

也許嘗試在run方法中添加while?現在你正在爲每一步創建一個新的runnable .. – 2014-12-04 14:47:38

+0

不幸的是仍然有一個bug。請查看上面更新的代碼,看看你能否幫助 – user2456977 2014-12-04 16:06:40

回答

4

你在做什麼,是你剛剛創建無限多的Runnable對象(即正在GCed)。你應該把while循環放在runnable裏面。也許它更好地將環路條件更改爲以下(它更可讀):

Runnable x = new Runnable(){ 
     @Override 
     public void run(){ 
      while(my_list_counter > 0){ 
       random_counter = rand.nextInt(my_list_counter); 
       make_words_with_letters.add(list_of_letters.get(random_counter)); 
       for(Button b:button_list) 
        if (b.getText().equals("")){ 
         b.setText(list_of_letters.get(random_counter)); 
         list_of_letters.remove(list_of_letters.get(random_counter)); 
         my_list_counter--; 
         break; 
        } 
       } 
     } 
    }; 
+0

但是,我如何處理Handler?我希望運行方法每5秒運行一次。但它不適用於你的代碼? – user2456977 2014-12-04 15:41:47

+0

我用你的代碼和新的錯誤更新了我原來的帖子。你能幫忙嗎?也感謝您已經完成的幫助 – user2456977 2014-12-04 16:02:58

1

while(true)run()

+0

不起作用。請看看我編輯過的最高職位。仍然有一個錯誤。 – user2456977 2014-12-04 16:08:16

+0

刪除while循環並使用SheduledThreadPoolExecutor方法sheduleAtFixedRate而不是Handler – 2014-12-04 16:33:56