我想要做的事: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」方法。
如果我能找到一種解決方法來使用TimerTask,那就太好了 - 我使用它是因爲我需要定期觸發此代碼(由用戶決定)。我喜歡這樣的想法:如果用戶位置不改變,但我怎麼能確定代碼將按照定期計劃的時間間隔運行而不使用Timer/TimerTask組合? – JMax2012 2012-03-08 02:28:13
等待,我想我可能已經發現了答案,實際上,requestLocationUpdates()調用包括一個固定的時間間隔,不是嗎?所以如果我做了在應用程序啓動時調用此方法,它應該繼續每x毫秒觸發一次,是否正確? – JMax2012 2012-03-08 02:32:11
requestLocationUpdates的時間間隔只是位置管理器的提示。您可能會獲得更少或更多的位置,如果設備休眠,您將無法獲得更多更新! – Stefan 2012-03-08 08:26:11