#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:
Вы могли бы:
- Передайте в него переменные (например,
TextView
для обновления или всего действия) - Сделайте переменные в использующем его классе статическими (класс timer может обращаться к ним напрямую)
- Реализовать механизм обратного вызова