2012-03-07 68 views
1

我想要做的事:Android的 - GPS位置更新 - 需要取消TimerTask的

1)更新用戶的位置信息,每隔x分鐘

2)使用一個定時器和TimerTask來調用Web服務記錄了最新的位置信息

發生了什麼事:

1)中,TimerTask創建

2)如果用戶的手機休眠/ SL eeping,調用Web服務無法正常工作

3)中,TimerTask似乎得到存儲在隊列

4)當用戶的電話被喚醒時,所有排隊TimerTasks的立即執行,導致在對Web服務

這裏多不必要的位置更新的代碼片段:

timer.scheduleAtFixedRate(new TimerTask() { 
@Override 
public void run() { 

    try 
    { 
     //validate that the device has an active & working connection 
     ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo activeNetwork = connMgr.getActiveNetworkInfo(); 

     //validate the the device network provider is enabled 
     if ((eview_locationManagerwifi 
       .isProviderEnabled(LocationManager.NETWORK_PROVIDER)) && (activeNetwork != null && activeNetwork.getState() == NetworkInfo.State.CONNECTED)) 
     { 
       UpdateSubscriberLocation(); // call the web service to report location data             
     } 
     else 
     { 
      this.cancel(); 
     } 
    } 
    catch (Exception e) 
    { 


    } 

網絡連接並啓用供應商的檢查顯然都與迴歸「真實」,因爲TimerTask的不通用電器沒有取消,它只是排隊,直到用戶的手機醒來。

如果在沒有來自Web服務的響應的情況下經過了一段時間,我該如何取消TimerTask?我無法在TimerTask上找到某種「setTimeout」方法。

回答

0

不要使用TimerTask,請使用LocationManager.requestLocationUpdates()。這不會像TimerTask那樣加起來,並且它相當簡化了代碼。如果用戶位置不變,您還可以獲得避免工作的額外好處。

+0

如果我能找到一種解決方法來使用TimerTask,那就太好了 - 我使用它是因爲我需要定期觸發此代碼(由用戶決定)。我喜歡這樣的想法:如果用戶位置不改變,但我怎麼能確定代碼將按照定期計劃的時間間隔運行而不使用Timer/TimerTask組合? – JMax2012 2012-03-08 02:28:13

+0

等待,我想我可能已經發現了答案,實際上,requestLocationUpdates()調用包括一個固定的時間間隔,不是嗎?所以如果我做了在應用程序啓動時調用此方法,它應該繼續每x毫秒觸發一次,是否正確? – JMax2012 2012-03-08 02:32:11

+0

requestLocationUpdates的時間間隔只是位置管理器的提示。您可能會獲得更少或更多的位置,如果設備休眠,您將無法獲得更多更新! – Stefan 2012-03-08 08:26:11

0

如果您需要快速更新,請使用WakeLock來防止設備關閉CPU。看到這裏的細節:http://developer.android.com/reference/android/os/PowerManager.html

如果您不需要更新快(可以說每隔一分鐘使用AlarmManager如果報警被觸發請求位置更新,發送您的數據和設置一個報警:http://developer.android.com/reference/android/app/AlarmManager.html

+0

只是爲了闡明OP和代碼片段:更新任務應基於用戶定義的設置觸發,通常每15分鐘或每30分鐘一次,具體取決於用戶在其首選項設置中選擇的內容。 – JMax2012 2012-03-08 14:29:43

+0

LocationManagerService包含PARTIAL_WAKE_LOCK,所以我不需要將它包含在您的應用程序中。 – jsmith 2012-03-08 15:33:49