2010-01-29 71 views
37

我目前正在嘗試在我的Android應用程序中設置WiFi掃描,每30秒掃描一次WiFi接入點。Android - 使用Timer和TimerTask控制任務?

我已經使用Timer和TimerTask來讓掃描在我需要的時間間隔內正確運行。

但是,我希望能夠停止並開始掃描,當用戶按下按鈕,我目前無法停止,然後重新啓動計時器和TimerTask。

這裏是我的代碼

TimerTask scanTask; 
final Handler handler = new Handler(); 
Timer t = new Timer(); 

public void doWifiScan(){ 

scanTask = new TimerTask() { 
     public void run() { 
       handler.post(new Runnable() { 
         public void run() { 
         wifiManager.scan(context); 
         Log.d("TIMER", "Timer set off"); 
         } 
       }); 
     }}; 


    t.schedule(scanTask, 300, 30000); 

} 

    public void stopScan(){ 

    if(scanTask!=null){ 
     Log.d("TIMER", "timer canceled"); 
     scanTask.cancel(); 
} 

} 

所以定時器和任務啓動罰款和掃描發生每隔30秒,但是我不能讓它停下來,我可以停止定時器但任務仍然出現和scanTask。取消()似乎也不工作。

有沒有更好的方法來做到這一點?或者我在Timer/TimerTask類中丟失了什麼?

回答

26

你可能會考慮:

  • 從你的任務調用cancel()檢查布爾結果,因爲它應該指出,如果您的請求成功或失敗
  • Timer而不是TimerTask
  • 嘗試 purge()cancel()

如果您不一定需要TimerTimerTask,您可以隨時使用postDelayed()(可在Handler和任何View上獲得)。這會延遲一段時間後在UI線程上執行Runnable。爲了讓它重現,只需在完成您的週期性工作之後再次安排自己。然後,您可以監視布爾標誌來指示此過程何時結束。例如:

private Runnable onEverySecond=new Runnable() { 
    public void run() { 
     // do real work here 

     if (!isPaused) { 
      someLikelyWidget.postDelayed(onEverySecond, 1000); 
     } 
    } 
}; 
+0

我試着查布爾在scanTask這樣 布爾tf = scanTask.cancel(); 但我現在得到一個空指針異常在該行。 但是,任務本身運行良好? 我最終會運行一個服務中的代碼,所以會使用postDelayed是一個選項? – 2010-01-29 14:59:38

+0

顯然,'scanTask'正在被重置爲'null',並且從您提供的代碼片斷中無法說出原因或nhow。 'postDelayed()'不是'Service'中的一個選項,但是在這種情況下爲什麼你需要/需要'Service'還不清楚。 – CommonsWare 2010-01-29 15:10:14

+0

scanTask沒有在整個應用程序的代碼中的其他地方使用,也不是Timer,我發佈的是Timer t和TimerTask scanTask的全部用法。我想創建一個應用程序,使用最少或沒有用戶界面,所以從閱讀有關Android的服務是這樣做的方式? – 2010-01-29 15:49:34

5

Android文檔說明cancel()取消計時器和所有計劃任務。如果當前正在運行的任務不受影響。此定時器上不能再安排更多任務。隨後的通話什麼都不做。這解釋了這個問題。使用

6

你的代碼,而不是

scanTask.cancel(); 

正確的做法是取消計時器(未TimerTask的):

t.cancel(); 
相關問題