2010-10-06 107 views
3

您好,我正在构建一个应用程序,它将在固定的时间段(例如,每30分钟)执行一段代码。我希望那段时间是严格的,我的意思是我希望保证这个时间段是30分钟,而不是28分钟,或者任何时候执行它。安卓计时器问题

我有一个定时器对象和如下使用它:

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中定义你的任务(就像你做的那样)并且调度定时器。无论你想在onCreateonResume/onStart

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. */ 
} 

只需执行的功能,例如。

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