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。
感谢您的任何意见可运行。
有没有什么办法可以使用这个,仍然可以选择调用'removeCallbacks(...)'来取消匿名的Runnable?我想不明白。 –
@CoryTrese当然,如果mHandler支持。如果您使用ExecutorService,它将返回一个可以取消()的Future。 –