2015-07-13 6 views
2

Итак, я смотрел на так много источников и всякий раз, когда возникает такая проблема, это потому, что countdowntimer пытается отменить изнутри ontick. Это не моя проблема. У меня есть countdowntimer в runnable. Я отменяю таймер, я отменяю runnable, и он все равно каким-то образом вызван. Ниже приведен код. Я ценю любую помощь!CountdownTimer не получается Отменено

Handler myHandler = new Handler(); 
Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     CountDownTimer countdownTimer = new CountDownTimer(difference - (1000 * 60) + 2000, 60000) { 
      public void onTick(long millisUntilFinished) {   // some work here 
      } 
      public void onFinish() { 
      // some other work here 
     }; 
     data.get(i).setCountDownTimer(countdownTimer); 
     data.get(i).getCountDownTimer().start(); 
    } 
}; 
data.get(i).setHandler(myHandler); 
data.get(i).setRunnable(runnable); 
data.get(i).start(2000); 

Начало функции в основном:

public void start(int milliseconds){ 
    handler.postDelayed(runnable, milliseconds); 
} 

данных представляет собой список объектов, где каждый из них имеет свой собственный работоспособный, обработчик и countdowntimer.

Вот что я делаю, когда я отменяю:

data.get(i).getCountDownTimer().cancel(); 
data.get(i).terminate(); 

Прервать функция в основном:

public void terminate() { 
     handler.removeCallbacks(runnable); 
} 

Кто-то пожалуйста, скажите мне, почему countdowntimer как-то по-прежнему работает после того, как я отменить это так, как я делать выше; благодаря!

UPDATE

В onFinish, у меня есть еще один отсчет, который находится на меньшем интервале. Вызывается onFinish, когда я отменяю CountDownTimer? В противном случае у меня действительно нет идей! Благодарю.

+1

'cancel()' должно быть достаточно. Как вы узнаете, что CDT все еще работает? – injecteer

+1

@ injecteer Поскольку onTick по-прежнему вызывается после того, как я отменил .. – TJ56

ответ

0

Хотя вы приложили немало усилий, чтобы опубликовать соответствующие фрагменты кода, мне трудно представить, как они все подходят друг другу. Например, когда вы создаете Runnable для каждого объекта данных, являются ли вызовы для установки и запуска таймера обратного отсчета действительно в методе run(), как показано? Мне интересно, как data и i доступны в этой точке. И если они действительно доступны, как вы знаете, что i будет иметь желаемое значение, когда Runnable выходит из очереди и выполняет?

Я согласен с тем, что cancel() должен привести к остановке CountDownTimer. Однако обратите внимание, что если start() вызывается после cancel(), таймер запустится заново - это не один выстрел. Если ошибка вызывает во второй раз start(), это будет выглядеть так, как будто отмена не работает.

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

0

Это была очень глупая ошибка на моем конце. Когда я удалял объект из списка данных, я отменял будильник через: data.get (i) .getCountDownTimer(). Cancel(); И затем я удаляю объект и не уведомляю об этом. Ошибка заключается в том, что я должен уведомлять об этом, и в onbind я должен отменить его. Затем я должен удалить запись, зная, что CTD отменен. В любом случае, спасибо всем за вклад.