javaandroidhandlerhandlerspostdelayed

How to stop series of postDelayed handlers


I have a series of postDelayed handlers. I'm having trouble to set a mathode that stops the handlers when the user is tapping on the stop button at any time I he wants.

I'll appreciate any help someone able to provide. Thanks

while (!lessonIsRunning) {
        Handler handler0 = new Handler();
        handler0.postDelayed(new Runnable() {
          @Override
          public void run() {
              plate1.setVisibility(ImageView.VISIBLE);
              plate2.setVisibility(ImageView.VISIBLE);
              plate3.setVisibility(ImageView.VISIBLE);
          }
        }, 6000);

        Handler handler1 = new Handler();
        handler1.postDelayed(new Runnable() {
          @Override
          public void run() {
              apples1.setVisibility(ImageView.VISIBLE);
          }
        }, 9000);

        Handler handler2 = new Handler();
        handler2.postDelayed(new Runnable() {
          @Override
          public void run() {
              plus1.setVisibility(TextView.VISIBLE);
          }
        }, 9250);
}
public void stopLesson(View V){

}

Solution

  • instead of writing the Runnable task in an anonymous way you must define it with a name, so that later you will have a link to it to remove:

    //there is no need for multiple handlers 
    //handler must be declared outside all functions, in order for you to use it everywhere. 
    
    Handler handler = new Handler(); 
    Runnable myFirstTask  = new Runnable (){
             @Override
                  public void run() {
                      plate1.setVisibility(ImageView.VISIBLE);
                      plate2.setVisibility(ImageView.VISIBLE);
                      plate3.setVisibility(ImageView.VISIBLE);
                  } };
    
        Runnable mySecondTask = new Runnable(){
            @Override
                  public void run() {
                      plus1.setVisibility(TextView.VISIBLE);
                  }
    
        };
    
        Runnable myThirdTask = new Runnable(){
            @Override
                  public void run() {
                      apples1.setVisibility(ImageView.VISIBLE);
                  } }
    
        //you can put different tasks on the same handler object
    
        while (!lessonIsRunning) {   
                handler.postDelayed(myFirstTask,6000);   
                handler.postDelayed(mySecondTask,9250);   
                handler.postDelayed(myThirdTask,9000); 
    } 
    public void stopLesson(View V){ 
        //notice that you don't need these, because the handlers are not recursive 
        //you don't have lines "handler.postDelayed(sameTask,someTime);" 
        //in your run Method of the runnable
     if(handler!=null){
        handler.removeCallbacks(myFirstTask);
        handler.removeCallbacks(mySecondTask); 
        handler.removeCallbacks(myThirdTask); 
        //if this method is inside onPause or onDestroy add this line as well: 
        handler=null; 
    
    }
     }