2016-11-02 12 views
2

Я использую таймер обратного отсчета, который обновляет мой индикатор выполнения, который уменьшается от 100 (полный) до 0 (пустой), но когда приложение приостановлено, вы хотите приостановить таймер, а затем перезапустите его после возобновления приложения. Я реализовать таймер обратного отсчета, как так:Android-студия приостанавливает и возобновляет отсчет таймера для индикатора выполнения

public class MyCountDownTimer extends CountDownTimer { 


    public MyCountDownTimer(long millisInFuture, long countDownInterval) { 
     super(millisInFuture, countDownInterval); 
    } 

    @Override 
    public void onTick(long millisUntilFinished) { 
     int progress = (int) (millisUntilFinished/100); 
     progressBar.setProgress(progress); 
    } 

    @Override 
    public void onFinish() { 
     progressBar.setProgress(0); 
     Intent intent = new Intent(getApplicationContext(), GameOver.class); 
     startActivity(intent); 
     finish(); 
    } 

} 

И в моем он создать:

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

    progressBar = (ProgressBar)findViewById(R.id.timerBar); 
    progressBar.setProgress(100); 
    myCountDownTimer = new MyCountDownTimer(10000, 10); 
    myCountDownTimer.start(); 
} 

ответ

1

Вы можете добавить логическое значение в вашем MyCountDownTimer класса, который будет меняться в и onResume методов Ваш Активность. Проверьте комментарии // ADDED, чтобы увидеть изменения, которые вы должны внести, чтобы сделать эту работу.

public class MyActivity extends Activity { 

    MyCountDownTimer myCountDownTimer; 

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

     progressBar = (ProgressBar)findViewById(R.id.timerBar); 
     progressBar.setProgress(100); 
     myCountDownTimer = new MyCountDownTimer(10000, 10); 
     myCountDownTimer.start(); 
    } 

    // ADDED 
    @Override 
    public void onPause() { 
     super.onPause(); // Always call the superclass method first 
     myCountDownTimer.pause(); 
    } 

    // ADDED 
    @Override 
    public void onResume() { 
     super.onResume(); // Always call the superclass method first 
     myCountDownTimer.resume(); 
    } 

} 


public class MyCountDownTimer extends CountDownTimer { 

    // ADDED 
    private boolean pause; 

    public MyCountDownTimer(long millisInFuture, long countDownInterval) { 
     super(millisInFuture, countDownInterval); 
    } 

    // ADDED 
    public void pause() { 
     pause = true; 
    } 

    // ADDED 
    public void resume() { 
     pause = false; 
    } 

    @Override 
    public void onTick(long millisUntilFinished) { 
     int progress = (int) (millisUntilFinished/100); 

     // ADDED 
     if (!pause) { 
      progressBar.setProgress(progress); 
     } 
    } 

    @Override 
    public void onFinish() { 
     // ADDED 
     isRunning = false; 

     progressBar.setProgress(0); 
     Intent intent = new Intent(getApplicationContext(), GameOver.class); 
     startActivity(intent); 
     finish(); 
    } 
} 
+0

Это работает, однако таймер продолжает работать в фоновом режиме и закончится активность при достижении 0 – Zorqe

+0

Ооо не думал об этом. Вы можете сделать следующее: сохранить значение таймера при его приостановке, отменить текущий таймер и, наконец, перезапустить новый таймер с оставшимся временем. Вы можете сохранить оставшееся время в методе 'onTick (...)'. Когда вы создаете свой таймер, установите более низкую 'countDownInterval' для большей точности. – WannaGetHigh