title: Android - How to stop and pause timer
body: <p>I have been running through alot of issues try to pause and unpause a timer, and if I lock the orientation to portrait or landscape it works, but thats not exactly what I want to do. Of course, the onCreate method is called when you change orientation, so im canceling my timertask and setting it to null, but after running through the orientation more than once, it doesnt cancel the timertask anymore. Ive looked through other peoples questions on here but none seem to hold the answer to my quesiton. Heres my code. Its a little sloppy at the moment because ive been trying about everything I can to get it to work.</p>
  
  <pre><code>public class singleTimer extends Activity implements OnClickListener {
  
  private Integer setTime = 0;
  private Integer tmrSeconds = 0;
  private Integer tmrMilliSeconds = 0;
  private Timer myTimer = new Timer();
  private TimerTask myTimerTask;
  private TextView timerText;
  private boolean isPaused = true;
  
  @Override
  public void onCreate(Bundle savedInstanceState) {
  
      super.onCreate(savedInstanceState);
      setContentView(R.layout.single_timer);
      Bundle extras = getIntent().getExtras();
      setTime = extras.getInt("com.bv.armyprt.timer_duration");
      if (myTimerTask != null) {
          myTimerTask.cancel();
          myTimerTask = null;
      }
      if (savedInstanceState != null) {
          if (savedInstanceState.getInt("tmrSeconds") == 0) {
              tmrSeconds = setTime;
          } else {
              tmrSeconds = savedInstanceState.getInt("tmrSeconds");
              tmrMilliSeconds = savedInstanceState.getInt("tmrMilliseconds");
  
              if (isPaused == false) {
                  myTimer = new Timer();
                  myTimerTask = new TimerTask() {
                      @Override
                      public void run() {
                          TimerMethod();
                      }
                  };
                  myTimer.schedule(myTimerTask, 0, 100);
              }
  
          }
      } else {
          tmrSeconds = setTime;
      }
      timerText = (TextView)findViewById(R.id.timerText);
      timerText.setText(String.format("%03d.%d", tmrSeconds, tmrMilliSeconds));
  
      TextView timerDesc = (TextView)findViewById(R.id.timerDescription);
      timerDesc.setText("Timer for: " + setTime.toString());
      Button startButton = (Button)findViewById(R.id.timerStart);
      Button stopButton = (Button)findViewById(R.id.timerStop);
      Button closeButton = (Button)findViewById(R.id.timerClose);
      closeButton.setOnClickListener(this);
      startButton.setOnClickListener(this);
      stopButton.setOnClickListener(this);
  
  }
  
  @Override
  public void onClick(View v) {
      // TODO Auto-generated method stub
      switch (v.getId()) {
      case (R.id.timerStart):
          isPaused = false;
          myTimer = new Timer();
          myTimerTask = new TimerTask() {
              @Override
              public void run() {
                  TimerMethod();
              }
          };
          myTimer.schedule(myTimerTask,0, 100);
          break;
  
      case (R.id.timerStop):
          isPaused = true;
          myTimerTask.cancel();
          myTimerTask = null;
          myTimer.cancel();
  
          break;
  
      case (R.id.timerClose):
          onDestroy();
          this.finish();
          break;
      }
  
  }
  private void TimerMethod()
  {
      //This method is called directly by the timer
      //and runs in the same thread as the timer.
      //We call the method that will work with the UI
      //through the runOnUiThread method.
      this.
      tmrMilliSeconds--;
      this.runOnUiThread(Timer_Tick);
  }
  
  private Runnable Timer_Tick = new Runnable() {
      public void run() {
  
      //This method runs in the same thread as the UI.               
          if (tmrSeconds &gt; 0) {
              if (tmrMilliSeconds &lt;= 0) {
                  tmrSeconds--;
                  tmrMilliSeconds = 9;
              }
          } else {
              Vibrator v = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
              v.vibrate(1000);
              myTimer.cancel();
              tmrSeconds = setTime;
              tmrMilliSeconds = 0;
              isPaused = true;
          }
  
      //Do something to the UI thread here
          timerText.setText(String.format("%03d.%d", tmrSeconds, tmrMilliSeconds));
      }
  };
  
  @Override
  public void onSaveInstanceState(Bundle savedInstanceState){
      savedInstanceState.putInt("setTimer", setTime);
      savedInstanceState.putInt("tmrSeconds", tmrSeconds);
      savedInstanceState.putInt("tmrMilliseconds", tmrMilliSeconds);
  
      super.onSaveInstanceState(savedInstanceState);
  }
  
  @Override
  public void onRestoreInstanceState(Bundle savedInstanceState) {
      super.onRestoreInstanceState(savedInstanceState);
  
      setTime = savedInstanceState.getInt("setTimer");
      tmrSeconds = savedInstanceState.getInt("tmrSeconds");
      tmrMilliSeconds = savedInstanceState.getInt("tmrMilliSeconds");
  }
  }
  </code></pre>