我希望在程序运行时每 5 秒执行一次 run
方法,因此我将其放入 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);
但是这段代码只是卡住了我的应用程序。这是日志猫:
它显示了有关 GC 被阻止的信息,但我不知道这到底意味着什么。有人可以帮忙吗?
最佳答案
你正在做的就是创建无限多个可运行对象(正在被GC)。您应该将 while 循环放在可运行的内部。也许最好将循环条件更改为以下内容(更具可读性):
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;
}
}
}
};
关于java - 可在 while 循环中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27296843/