简体   繁体   中英

Pausing and resuming a runnable thread

I have an activity (not my main activity) that plays some sounds and draw some graphics in a runnable thread. There is an imagebutton with which I'm supposed to suspend and resume the thread. But whatever I try the thread just runs on. I'm totally stuck! Please help.

public class PlayInterval extends Activity {
   private Handler customHandler;
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_playinterval);
      final ImageButton playPauseButton = (ImageButton) findViewById(R.id.playPauseButton);//Play/Pause
      playPauseButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
           onPlayPauseClicked(playPauseButton,(String)playPauseButton.getTag());
        }
     });
     customHandler = new Handler();
     new Thread(new Task()).start();
  }
  @Override
  public void onBackPressed() {
     customHandler.removeCallbacksAndMessages(null);
     finish();
  }
  class Task implements Runnable {
     @Override
     public void run() {
        // Do really cool stuff
        // and even cooler stuff
        customHandler.postDelayed(this, 100);
     }
  }
  private void onPlayPauseClicked(ImageButton playPauseButton, String status) {
     if (status == "playing") {
        playPauseButton.setTag("paused");
        customHandler.removeCallbacksAndMessages(null); //TODO suspend here not working!
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
           playPauseButton.setImageResource(getResources().getIdentifier("pause_image", "drawable", getPackageName()));
        } else {
            playPauseButton.setImageDrawable(getDrawable(getResources().getIdentifier("pause_image", "drawable", getPackageName())));
        }
    } else {
        playPauseButton.setTag("playing");
        customHandler.postDelayed(this, 100); //TODO resume here not working!
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            playPauseButton.setImageResource(getResources().getIdentifier("play_image", "drawable", getPackageName()));
        } else {
            playPauseButton.setImageDrawable(getDrawable(getResources().getIdentifier("play_image", "drawable", getPackageName())));
        }
    }
  }
}

I never did get an answer so after trial and error I came up with this. I've red quite alot here on StackOverflow and what I understand this is NOT the way it is supposed to be done. But it is working very well, so if anyone could explain why one shouldn't use syncronized methods like this and provide a better answer I would be thankful. Cheers

public class PlayInterval extends Activity {
   private Handler customHandler;
   Boolean isRunning;
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_playinterval);
      final ImageButton playPauseButton = (ImageButton)findViewById(R.id.playPauseButton);//Play/Pause
      playPauseButton.setOnClickListener(new View.OnClickListener() {
         public void onClick(View v) {
            onPlayPauseClicked(playPauseButton);
         }
      });
      customHandler = new Handler();
      isRunning=true;
      new Thread(new Task()).start();
   }

   @Override
   public void onBackPressed() {
      customHandler.removeCallbacksAndMessages(null);
      finish();
   }

   class Task implements Runnable {
      @Override
      public void run() {
      if (isRunning == true){
         // Do really cool stuff
         // and even cooler stuff
      } else {
         // it is paused
      }
      customHandler.postDelayed(this, 100);
   }


   private syncronized void onPlayPauseClicked(ImageButton playPauseButton) {
     if (isRunning==true) {
        isRunning=false;
        playPauseButton.setImageResource(getResources().getIdentifier("play_image", "drawable", getPackageName()));
     } else {
        isRunning=true;
        playPauseButton.setImageResource(getResources().getIdentifier("pause_image", "drawable", getPackageName()));
      }
  }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM