2010-10-06 113 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