androidloopstimertimertaskhandlers

Android - loop part of the code every 5 seconds


I would like to start repeating two lines of code every 5 seconds when I press the button START and end it, when I press the button STOP. I was trynig with a TimerTask and Handles, but couldn't figure it out how.

public class MainActivity extends Activity {




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


           //final int i;
           final TextView textView = (TextView) findViewById(R.id.textView);
           final Button START_STOP = (Button) findViewById(R.id.START_STOP);
           final ImageView random_note = (ImageView) findViewById(R.id.random_note);
           final int min = 0;
           final int max = 2;
           final Integer[] image = { R.drawable.a0, R.drawable.a1,R.drawable.a2 };



        START_STOP.setTag(1);
        START_STOP.setText("START");


        START_STOP.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
            int status = (Integer) v.getTag();
            if (status ==1) {
                textView.setText("Hello");
                START_STOP.setText("STOP");
                v.setTag(0);

                final Random random = new Random();

                                //************************************************************
                // I would like to loop next 2 lines of code every 5 seconds.//

                                int i = random.nextInt(2 - 0 + 1) + 0;
                random_note.setImageResource(image[i]);

                //************************************************************
                    }

            else
            {
                textView.setText("Bye");
                START_STOP.setText("Let's PLAY!");
                v.setTag(1);
            }


            }
        });     

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }


}

Solution

  • Using a CountDownTimer as in one of the other answers is one way to do it. Another would be to use a Handler and the postDelayed method:

    private boolean started = false;
    private Handler handler = new Handler();
    
    private Runnable runnable = new Runnable() {        
        @Override
        public void run() {
            final Random random = new Random();
            int i = random.nextInt(2 - 0 + 1) + 0;
            random_note.setImageResource(image[i]);
            if(started) {
                start();
            }
        }
    };
    
    public void stop() {
        started = false;
        handler.removeCallbacks(runnable);
    }
    
    public void start() {
        started = true;
        handler.postDelayed(runnable, 2000);        
    }
    

    Here's an example using a Timer and a TimerTask:

    private Timer timer;
    private TimerTask timerTask = new TimerTask() {
    
        @Override
        public void run() {
            final Random random = new Random();
            int i = random.nextInt(2 - 0 + 1) + 0;
            random_note.setImageResource(image[i]);
        }
    };
    
    public void start() {
        if(timer != null) {
            return;
        }
        timer = new Timer();
        timer.scheduleAtFixedRate(timerTask, 0, 2000);
    }
    
    public void stop() {
        timer.cancel();
        timer = null;
    }