在while循环中运行

时间:2014-12-04 14:45:18

标签: java android handler runnable

我希望我的run方法在我的程序运行时每5秒执行一次,所以我把它放在while(true)循环中。问题是我的应用程序因为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被阻止的内容,但我不确切地知道这意味着什么。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:4)

你在做什么,是你正在创造无限多个可运行的对象(正在进行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;
                   } 
               }
        }
    };

答案 1 :(得分:1)

while(true)放入run()