2011-10-23 37 views
2

我创建了两个由runnable()实现的类。然后我会多次给他们打电话,时间不定。问题是,当我稍后运行runnable时,需要在调用postdelay时知道变量的值,而不是实际运行时的值。如何将变量传递到postdelayed runnable?

我认为我现在需要做的是将变量传递给可运行实例,当我调用post延迟时。但对于我的生活,我无法弄清楚如何去做。下面是引用源代码:

public void PlaySequence() throws InterruptedException{ 

for(int i = 0;i<level;i++){ 
    mHandler.postDelayed(mToggleButtonOn, (i+1)*playbackOffTime); 
    mHandler.postDelayed(mToggleButtonOff, (i+1)*playbackOnTime);   
    currentProgIteration++; 
}   
currentProgIteration=0;  
} 

private Runnable mToggleButtonOn = new Runnable() { 

public void run() { 
    try { 
      if(Sequence[currentProgIteration]==0){ 
       ImageCard[0].setImageDrawable(getResources().getDrawable(R.drawable.yellow)); 
      } 
      else if(Sequence[currentProgIteration]==1){ 
       ImageCard[1].setImageDrawable(getResources().getDrawable(R.drawable.blue)); 
      } 
      else if(Sequence[currentProgIteration]==2){ 
       ImageCard[2].setImageDrawable(getResources().getDrawable(R.drawable.red)); 
      } 
      else if(Sequence[currentProgIteration]==3){ 
       ImageCard[3].setImageDrawable(getResources().getDrawable(R.drawable.green)); 
      }     
     } 
    catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } 

} 
}; 

private Runnable mToggleButtonOff = new Runnable() { 

public void run() { 
    Log.d("Info", "running Off currentProgIteration: "+currentProgIteration); 

    try { 
      if(Sequence[currentProgIteration]==0){ 
       ImageCard[0].setImageDrawable(getResources().getDrawable(R.drawable.darkyellow)); 
      } 
      else if(Sequence[currentProgIteration]==1){ 
       ImageCard[1].setImageDrawable(getResources().getDrawable(R.drawable.darkblue)); 
      } 
      else if(Sequence[currentProgIteration]==2){ 
       ImageCard[2].setImageDrawable(getResources().getDrawable(R.drawable.darkred)); 
      } 
      else if(Sequence[currentProgIteration]==3){ 
       ImageCard[3].setImageDrawable(getResources().getDrawable(R.drawable.darkgreen)); 
      }     
     } 
    catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } 

} 
}; 

使用全局变量currentProgIteration,但他们的延迟之后运行的时候,这个变量已经重新设置为0。

感谢您的任何意见可运行。

回答

3

最简单的方法可能是使用匿名Runnable。

final int delay = (i+1)*playbackOffTime; 
mHandler.postDelayed(new Runnable() { 
    final Color[] colours = { R.drawable.yellow, R.drawable.blue, R.drawable.red, R.drawable.green } ; 
    public void run() { 
     try { 
      // can use "delay" here 
      int seq = Sequence[currentProgIteration]; 
      ImageCard[seq].setImageDrawable(getResources().getDrawable(colours[seq])); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } 
    } 
}); 
+0

有没有什么办法可以使用这个,仍然可以选择调用'removeCallbacks(...)'来取消匿名的Runnable?我想不明白。 –

+0

@CoryTrese当然,如果mHandler支持。如果您使用ExecutorService,它将返回一个可以取消()的Future。 –