处理程序暂停或停止操作
问题描述:
我有5 Buttons
。每个Button
的文本都设置为list_of_letters
的一个随机字母。此外,这些字母每5秒钟一次显示一次 - 这就是为什么我使用Handler
和Runnable
。并且每隔5秒钟,将添加到Button
的那封信从list_of_letters
中删除。处理程序暂停或停止操作
问题:当所有5个Buttons
包含一个字母时,Runnable
仍在运行并每5秒从list_of_letters
中删除字母。有没有办法可以暂停Handler
或停止其动作,以便只在Button
不包含文字时才会运行?
这里是我的代码:
for (int i = 0; i < 10; i++) {
Runnable x = new Runnable(){
@Override
public void run(){
random_counter = rand.nextInt(my_list_counter);
for(Button b:button_list) //contains the 5 buttons
if (b.getText().equals("")){ //if button is empty, add text to it
b.setText(list_of_letters.get(random_counter)); //sets text to random letter from List
break;
}
list_of_letters.remove(list_of_letters.get(random_counter)); //then removes that letter from the List
my_list_counter--;
}
};
Handler handler = new Handler();
handler.postAtTime(x, SystemClock.uptimeMillis() + i*5000); //a letter gets posted every 5 seconds
}
编辑:这里是我当前的代码。在handler.post(x)
有错误。该错误说:本地变量x
可能尚未初始化。你的代码的
final Runnable x = new Runnable() {
@Override
public void run(){
if(my_list_counter <= 0)
return; // i'm guessing my_list_counter is the length of the array/list.
random_counter = rand.nextInt(my_list_counter);
for(Button b:button_list) //contains the 5 buttons
{
if (b.getText().equals("")) { //if button is empty, add text to it
b.setText(list_of_letters.get(random_counter)); //sets text to random letter from List
list_of_letters.remove(list_of_letters.get(random_counter)); //then removes that letter from the List
my_list_counter--;
Handler handler = new Handler();
handler.post(x);
// handler.postAtTime(x, SystemClock.uptimeMillis() + 5000); //a letter gets posted every 5 seconds
break;
}
}
}
};
答
移动一部分取出信件,并创建一个新的处理程序是在循环中:
@Override
public void run(){
if(my_list_counter <= 0) return; // i'm guessing my_list_counter is the length of the array/list.
random_counter = rand.nextInt(my_list_counter);
for(Button b:button_list) //contains the 5 buttons
{
if (b.getText().equals("")) { //if button is empty, add text to it
b.setText(list_of_letters.get(random_counter)); //sets text to random letter from List
list_of_letters.remove(list_of_letters.get(random_counter)); //then removes that letter from the List
my_list_counter--;
Handler handler = new Handler();
handler.postDelayed(x, 5000); //a letter gets posted every 5 seconds
break;
}
}
}
编辑:,你可以用它代替postAtTime postDelayed。间隔不会完全是5秒,但非常接近(毫秒差)。
将Runnable X = new Runnable()
初始化移到任何方法之外。
例如,如果你的代码是一个活动里面:
public class yourClass extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState) {
//....
}
Runnable x = new Runnable()
{
// the rest of the code.
};
}
,并呼吁new Handler().post(x);
得到它开始。
我会尝试这个,但这里有一些错误:'我'没有在handler.postAtTime中定义,x也不存在 – user2456977 2014-12-04 04:41:38
当我添加最终的Runnable x = new Runnable到你的答案时,我仍然得到一个错误在行:handler.postAtTime(x,SystemClock.uptimeMillis()+ i * 5000);它说局部变量x mat没有被初始化。有任何想法吗? – user2456977 2014-12-04 04:51:54
感谢您编辑@Happy Cupz Cupz,但仍然存在错误。我编辑我的帖子上面的问题。请让我知道你是否可以帮忙。再次感谢 – user2456977 2014-12-04 05:15:10