окончание CountDownTimer нажатием кнопки - PullRequest
0 голосов
/ 08 января 2020

Таким образом, у меня есть кнопка «Пуск» 1, при нажатии которой она получает текст из EditText1, а затем вызывает CountDownTimer для вызова метода, который передает текст из EditText1 через его параметры и отображает что-то в TextView1 каждые 10 секунд. Однако, если вы решите ввести что-то еще в EditText1 и снова нажмете кнопку запуска 1, он снова вызовет CountDownTimer.

В этом случае будет 2 переменные "doThis" CountDownTimer и выполняется doThis. cancel () отменяет только вторую переменную CountDownTimer "doThis". Мне интересно, как это исправить.

[EditText1]

[Кнопка запуска 1] [TextView1] [Кнопка завершения 1]
[Кнопка запуска 2] [TextView2] [Конец Кнопка 2]

CountDownTimer doThis;

doThis = new CountDownTimer(10000,10000)
    {
        @Override
        public void onTick(long millisUntilFinished) {

        }

        @Override
        public void onFinish() {
            start();
            TextView text = (TextView)findViewById(R.id.text);
            try {
                Date date = new Date(System.currentTimeMillis());
                text.setText(myMethod(variableFromEditText1));
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }.start();

Ответы [ 2 ]

0 голосов
/ 08 января 2020

Вы должны отменить таймер, прежде чем назначить ему новый - таким образом вы сможете отслеживать его.

// Declare the timer as private variable to keep track of it
private CountDownTimer doThis;

// Method called once the Edit field is editted
public void onEdit() {
    // Check if timer isn't running already, in case it is, cancel it
    if (doThis != null)
        doThis.cancel();

    // And finally, assign the new timer
    doThis = new CountDownTimer(10000, 10000) {
        @Override
        public void onTick(long millisUntilFinished) {

        }

        @Override
        public void onFinish() {
            start();
            TextView text = (TextView) findViewById(R.id.text);
            try {
                Date date = new Date(System.currentTimeMillis());
                text.setText(myMethod(variableFromEditText1));
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }.start();
}

Редактировать : Очевидно, это позволяет запускать только один таймер за раз - уже были предложены и рабочие способы запуска нескольких таймеров в комментариях.

0 голосов
/ 08 января 2020

Если вы хотите иметь несколько таймеров и связанных с ними кнопок / видов текста одновременно, я бы порекомендовал вам сохранить их в списке. Вам нужно будет "сохранить" таймер CountDownTimer cdt = new CountDownTimer [...]. Я бы даже сделал обертку для кнопок начала / конца, текстового представления и самого таймера. что-то вроде:

class MyTimer {

  Button start;
  Button end;
  TextView text;
  CountDownTimer cdt;

  // add here all required getters/setters and a constructor as needed
// the constructor of this wrapper can take details about the buttons location, text view location, and countdown amounts etc. or set them defaults as deemed necessary



}

Затем в MyTimer вы можете поместить все логики c запуска / остановки / сброса в методы с красивыми именами, которые вызываются обработчиками событий зарегистрированных кнопок.

Затем составьте список, сколько MyTimers вы хотите. List<MyTimer> myTimers = new ArrayList<>();

Этот список поможет вам отслеживать, сколько у вас есть, если вы хотите добавить больше и позволить вам настраивать и управлять кучей таймеров, которые вы хотите.

...