android计时器问题

时间:2010-10-06 10:15:31

标签: android

您好我正在构建一个应用程序,它将在固定的时间段(例如每30分钟)执行一段代码。我希望那个时期是严格的,我的意思是我希望保证这段时间是30分钟而不是28分钟,或者只要操作系统执行它。

我有一个Timer对象并按如下方式使用它:

timer=new Timer(); timer.scheduleAtFixedRate(new GetLastLocation(), 0, this.getInterval()); 其中GetLastLocation是扩展TimerTask的处理程序类。 这工作正常,但我希望能够更改间隔,我目前正在做的是使用timer.scheduleAtFixedRate两次并更改interval参数让我们说一个newInterval但我认为这只是有两个定时器执行每个间隔和新的 现在间隔,我是对的吗?

我也尝试取消定时器,然后使用scheduleAtFixedRate()方法,但这会引发文档中所述的异常。

我该怎么做才能解决这个问题? 关于maxsap

3 个答案:

答案 0 :(得分: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 :(得分: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. */
}

只需在任意位置执行此功能,例如在onCreateonResume / onStart中执行。

答案 2 :(得分:0)

您也可以使用handler而不是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