2010-10-06 3 views
3

Здравствуйте, я создаю приложение, которое будет выполнять блок кода с фиксированными периодами времени (например, каждые 30 минут). Я хотел бы, чтобы этот период был строгим, я имею в виду, что я хотел бы быть уверенным, что период будет 30 минут, а не 28 минут или всякий раз, когда os хочет его выполнить.android timer question

У меня есть объект таймера и использовать его следующим образом:

timer=new Timer(); timer.scheduleAtFixedRate(new GetLastLocation(), 0, this.getInterval()); где GetLastLocation класс обработчика которым проходит TimerTask. Это работает отлично, но я хотел бы иметь возможность изменить интервал, то, что я сейчас делаю, это использовать timer.scheduleAtFixedRate дважды и изменить параметр интервала, чтобы сказать newInterval, но я думаю, что это просто наличие двух таймеров, выполняемых каждый интервал и новый Интервал сейчас, я прав?

также я пытаюсь отменить таймер, а затем использовать метод scheduleAtFixedRate(), но это вызывает исключение, указанное в документации.

что делать, чтобы исправить это? приветствует maxsap

ответ

5

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

Timer timer; 
synchronized void setupTimer(long duration){ 
    if(timer != null) { 
    timer.cancel(); 
    timer = null; 
    } 
    timer = new Timer(); 
    timer.scheduleAtFixedRate(new GetLastLocation(), 0, duration); 
}
Теперь вы можете вызвать setupTimer всякий раз, когда вы хотите изменить продолжительность таймера.
PS: В fixed-rate execution каждое исполнение запланировано относительно запланированного времени выполнения начального выполнения. Если исполнение задерживается по какой-либо причине (например, сбор мусора или другая фоновая активность), два или более исполнения будут выполняться в быстрой последовательности, чтобы «догнать». В конечном счете, частота выполнения будет в точности совпадать с указанным периодом (при условии, что системные часы, лежащие в основе Object.wait (long), точны).

1

Определите свою задачу внутри TimerTask (как и вы) и запланируйте таймер.

public final void checkFunction(){ 
    t = new Timer(); 
    tt = new TimerTask() { 
     @Override 
     public void run() { 
      //Execute code... 
     } 
    }; 
    t.schedule(tt, 10*1000); /* Run tt (your defined TimerTask) 
    again after 10 seconds. Change to your requested time. */ 
} 

Просто запустите функцию, где вы хотите, например, в onCreate или в onResume/onStart.

0

Вы также можете использовать обработчик вместо timertask.

Handler mHandler = new Handler() { 
    public void handleMessage(Message msg) { 
     if(what.msg==1) 
     { 
      what.msg==2; 
     }  
    } 
}; 
mHandler.sendEmptyMessageDelayed(1, 10* 1000);//10*1000 10 sec.specify your time