我想用一个按钮停止一个for循环,但我不能让它工作。
我有一个布尔值表示之前没有按过按钮。
按下按钮时,布尔值会更改以指示已按下,启动方法AccionPorSegundo
,然后将按钮文本更改为“停止”。
在AccionPorSegundo
中,有一个持续40秒的循环。
如果按下按钮,现在文本“停止”,循环停止
这是我的代码,但它不起作用:
public class EL_Entrenamiento extends ActionBarActivity implements View.OnClickListener {
Handler mHandler = new Handler();
TextView tv1,tv2;
int a = 1;
int max = 9;
int min = 0;
int i = 1;
Button comenzar;
Boolean exit = false;
Boolean presionado = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.el_entrenamiento_layout);
comenzar = (Button) findViewById(R.id.bt_el_entrenamiento_comenzar);
tv1 = (TextView) findViewById(R.id.tv_El_entrenamiento1);
tv2 = (TextView) findViewById(R.id.tv_El_entrenamiento2);
comenzar.setOnClickListener(this);
//ACTION BAR PERSON
BitmapDrawable bg = (BitmapDrawable)getResources().getDrawable(R.drawable.ab_background_textured_rojo);
bg.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
getSupportActionBar().setBackgroundDrawable(bg);
BitmapDrawable bgSplit = (BitmapDrawable)getResources().getDrawable(R.drawable.bg_striped_split_img);
bgSplit.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
getSupportActionBar().setSplitBackgroundDrawable(bgSplit);
getSupportActionBar().setLogo(R.drawable.ic_action_entrenamiento);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
//FONFO BOTON PERSON
comenzar.setBackgroundDrawable(bg);
}
final Handler handler = new Handler();
final Timer timer = new Timer();
final Runnable doA = new Runnable() {
@Override
public void run() {
Random rand = new Random();
int randomNum1 = rand.nextInt((max - min) + 1) + min;
int randomNum2 = rand.nextInt((max - min) + 1) + min;
tv1.setVisibility(View.VISIBLE);
tv2.setVisibility(View.VISIBLE);
tv1.setText("" + randomNum1);
tv2.setText("" + randomNum2);
tv1.postDelayed(new Runnable() {
public void run() {
tv1.setVisibility(View.INVISIBLE);
tv2.setVisibility(View.INVISIBLE);
if (a==41){
comenzar.setText("Comenzar");
}
}
}, 500);
a++;
}
};
public void AccionPorSegundo(){
for ( i = 1; i <= 40; i++) {
if (this.exit) break;
TimerTask task = new TimerTask() {
@Override
public void run() {
handler.post(doA);
}
};
timer.schedule(task, i * 1000);
}
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.bt_el_entrenamiento_comenzar:
if (!presionado){
presionado=true;
AccionPorSegundo();
comenzar.setText("Stop");
}else{
exit=true;
comenzar.setText("Comenzar");
}
}
}
}
任何人都可以帮我吗?
答案 0 :(得分:1)
您正在使用for循环启动40个Threads。为什么不使用1个线程并在那里完成所有工作?然后通过设置boolean exit = false
来停止de循环for(int i=0; i<40 && exit; i++) {
// do the things you want
}
我猜你现在拥有它的方式,40秒他是忙着开始你不能按下按钮的线程。为了改变它,确保在UI-threath上没有执行大量的CPU使用。
答案 1 :(得分:0)
martijnn2008的答案很有帮助,但我遇到了同样的问题并通过使用&#34;或者#34;来解决它。 exit
&#34;或&#34; i < 40
。
我将&& exit
更改为|| exit
,以便可以独立地停止它们:)