用于在Android上停止for循环的按钮

时间:2013-11-16 23:43:15

标签: java android button for-loop

我想用一个按钮停止一个for循环,但我不能让它工作。

  1. 我有一个布尔值表示之前没有按过按钮。 按下按钮时,布尔值会更改以指示已按下,启动方法AccionPorSegundo,然后将按钮文本更改为“停止”。

  2. AccionPorSegundo中,有一个持续40秒的循环。

  3. 如果按下按钮,现在文本“停止”,循环停止

  4. 这是我的代码,但它不起作用:

    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");
                    }
    
            }
        }
    }
    

    任何人都可以帮我吗?

2 个答案:

答案 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,以便可以独立地停止它们:)