Таймер не останавливается на Android
ПРОБЛЕМА
У меня проблемы с остановкой таймера во время разработки в Android.
Таймер уже имеет значение null, когда дело доходит до его остановки.
Затем я перемещаю инициализацию таймера вне метода, точно так же, как TimerTask, которая решает нулевую проблему, но все равно не отменяет, когда на нее вызывается timer.cancel();
.
Ниже приведен пример, когда таймер уже имеет значение null, когда дело доходит до остановки записи.
TimerTask
My TimerTask
инициализируется внутри класса, но вне метода и кодов ниже...
private TimerTask task = new TimerTask() {
@Override
public void run() {
Log.e("TRACK_RECORDING_SERVICE","Timer Running");
}
};
Таймер и запуск таймера
Затем у меня есть метод startRecroding, который вызывается, когда я хочу запустить таймер...
public void startRecording(){
timer = new Timer("Message Timer");
timer.scheduleAtFixedRate(this.task, 0, 1000);
}
Таймер остановки
Затем я вызываю метод ниже, когда хочу остановить таймер...
public void stopRecording() {
if (timer != null) {
timer.cancel();
timer = null;
} else {
Log.e("TRACK_RECORDING_SERVICE","Timer already null.");
}
}
Любая помощь будет высоко оценена.
Ответы
Ответ 1
timer = new Timer("Message Timer");
Здесь ваш объект timer
не является static
, поэтому timer.cancel();
отменяет другой экземпляр класса Timer. Я предлагаю вам создать статическую переменную экземпляра класса Timer в верхней части класса, как показано ниже,
private static Timer timer;
Ответ 2
в методе run(), проверьте, нет ли таймера, затем
private TimerTask task = new TimerTask() {
@Override
public void run() {
if (timer == null)
cancel();
...
}
Ответ 3
if(waitTimer != null) {
waitTimer.cancel();
waitTimer.purge()
waitTimer = null;
}
Ответ 4
Попробуйте этот пример....
TimerTask mTimerTask;
final Handler handler = new Handler();
Timer t = new Timer();
int nCounter = 0;
//function for start timer
public void doTimerTask()
{
mTimerTask = new TimerTask()
{
public void run()
{
handler.post(new Runnable()
{
public void run()
{
nCounter++:
//your code
.....
......
}
});
}};
// public void schedule (TimerTask task, long delay, long period)
t.schedule(mTimerTask,0,50); //
}
//function for stop timer
public void stopTimerTask(){
if(mTimerTask!=null){
Log.d("TIMER", "timer canceled");
mTimerTask.cancel();
nCounter = 0;
}
}
//используйте выше двух функций для таймера запуска и остановки.
Ответ 5
Я знаю это поздно, но я также столкнулся с этой проблемой в своем проекте и надеюсь, что мое решение может дать людям некоторые идеи. Что я сделал в своем проекте, как показано ниже:
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
//TODO Update UI
}
};
public void stopTimer() {
if (timer != null) {
handler.removeCallbacks(runnable);
timer.cancel();
timer.purge();
timer = null;
}
}
public startTimer() {
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
handler.post(runnable);
}
}, 0, 100);
}
Я думаю, что пропущенные в предыдущих ответах removeCallbacks.
Ответ 6
На всякий случай, если кто-то еще придет сюда, чтобы найти решение этой проблемы, вот мой опыт.
Я запускаю таймер в службе.
startForegroundService(mServiceIntent);
timer = new Timer();
Когда вы обновляете сервис, вы не обязательно сначала отменяете его, вы просто вызываете startForegroundService (mServiceIntent); очередной раз.
Если вы не отмените таймер до обновления службы, исходный таймер все еще будет работать в фоновом режиме и вызывать методы, даже если вы остановите таймер в обновленной новой службе.
Таким образом, чтобы подвести итог, остановите свой таймер, прежде чем обновлять или обновлять фоновую задачу.
Надеюсь, это кому-нибудь поможет.
Ответ 7
Итак, проблема была в том, что инстанцирование не было фактической остановки таймера.
Каждый раз, когда я звонил:
timer = Timer()
timer!!.scheduleAtFixedRate(object : TimerTask() {
override fun run() {
//something
}
}, delay, period)
Он создал другой экземпляр, поэтому старый экземпляр все еще работал где-то без возможности остановить его.
Поэтому я просто создал его, когда таймер обнуляется, чтобы ни один предыдущий экземпляр не работал и не работал в фоновом режиме.
if(timer == null) {
timer = Timer()
timer!!.scheduleAtFixedRate(object : TimerTask() {
override fun run() {
// something
}
}, delay, period)
}
Затем просто отмените его и установите в ноль.
fun stopTimer() {
if (timer != null) {
timer!!.cancel()
timer!!.purge()
timer = null
}
}