Таймер обратного отсчета Android как отдельный класс

#java #android #class #timer #listener

#java #Android #класс #таймер #прослушиватель

Вопрос:

Я создал свой собственный класс, который расширяет CountDownTimer. Поскольку я часто им пользуюсь, я хотел бы иметь этот класс в своем собственном java-файле.

Однако я не знаю способа, которым класс timer мог бы взаимодействовать с классом, который его создал.

Пример: класс A имеет TextView, который отображает некоторое количество секунд. Итак, класс A создает таймер.

  • Как можно указать методу OnTick() в CountDownTimer, чтобы он обновлял мой TextView с текущим временем?
  • Как мой класс A может узнать, когда таймер закончился?

Я уверен, что это простой ответ, я просто очень мало знаю о потоках, обработчиках, слушателях и обо всем остальном, что вы, волшебники, готовите.

Ответ №1:

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

Например.

     mCountDownTimer = MyCountDownTimer(totalMsecs, callInterval, this).start();
  

Где у MyCountownTime были бы такие методы, как этот:

         public void onTick(long millisUntilFinished) {

            float fraction = millisUntilFinished / (float) totalMsecs;

                        // myActivity is passed in the constructor
            mMillisUntilFinished = millisUntilFinished;

            // progress bar is based on scale of 1 to 100;
            mActivity.progressBar.setProgress((int) (fraction * 100));

        }

        public void onFinish() {
                mMillisUntilFinished = 0;
            handleTimeOut();
        }
  

Это предполагает, что mActivity передается в конструкторе. Я изменил код, чтобы предположить, что вызывающее действие было передано как переменная в конструкторе timer и установлено как член класса timer.

Комментарии:

1. Хорошо, я понимаю, о чем вы говорите. Теперь, когда таймер завершается, как мне вызвать метод, который находится в вызывающем классе?

2. Есть идеи? Я вижу, что вы можете получить доступ к переменным действия, которое было передано, но как бы вы вызвали метод, принадлежащий этому действию?

3. @Allen Ты когда-нибудь выяснял, как это сделать?

4. Да. В конструкторе MyCountDownTimer вместо того, чтобы принимать «Activity activity» в качестве параметра, я заставил конструктор использовать интерфейс. Что-то вроде прослушивателя TimerListener. Этот интерфейс реализован действием, так что таймер обратного отсчета может вызывать любой из методов, перечисленных в интерфейсе для действия.

Ответ №2:

Вы могли бы:

  1. Передайте в него переменные (например, TextView для обновления или всего действия)
  2. Сделайте переменные в использующем его классе статическими (класс timer может обращаться к ним напрямую)
  3. Реализовать механизм обратного вызова