2014-12-04 60 views
0

我有5 Buttons。每个Button的文本都设置为list_of_letters的一个随机字母。此外,这些字母每5秒钟一次显示一次 - 这就是为什么我使用HandlerRunnable。并且每隔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; 
          } 
        } 
       } 
     }; 

回答

1

移动一部分取出信件,并创建一个新的处理程序是在循环中:

@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);得到它开始。

+0

我会尝试这个,但这里有一些错误:'我'没有在handler.postAtTime中定义,x也不存在 – user2456977 2014-12-04 04:41:38

+0

当我添加最终的Runnable x = new Runnable到你的答案时,我仍然得到一个错误在行:handler.postAtTime(x,SystemClock.uptimeMillis()+ i * 5000);它说局部变量x mat没有被初始化。有任何想法吗? – user2456977 2014-12-04 04:51:54

+0

感谢您编辑@Happy Cupz Cupz,但仍然存在错误。我编辑我的帖子上面的问题。请让我知道你是否可以帮忙。再次感谢 – user2456977 2014-12-04 05:15:10