2011-04-11 77 views
3

我有定期的服務,我開始每5分鐘使用一次警報。 Service實現LocationListener以獲取GPS修復並將其保存到SqLite數據庫中。LocationManager在服務 - 需要停止,如果1分鐘內沒有修復

我給服務1分鐘以獲得最佳修復可能。如果我在此之前獲得準確性 - 甚至更好。

所有的工作正常。我也有代碼,檢查是否禁用GPS,所以我退出服務。

我想要做的是:如果1分鐘內沒有修復 - 我想退出服務。目前,由於大多數邏輯(時間檢查等)在onLocationChanged - 我從來沒有機會這樣做,因爲我從來沒有位置。

是否有計時器或類似的東西,我可以使用?我是Java新手,例子會很好。我看到它是這樣的:在開始時,我使用回調創建了計時器,在此回調函數中,我將清理並關閉。我不確定是否會有可能onLocationChanged運行的影響?

我可以禁用計時器,只要我onLocationChanged?

回答

3

使用android.os.Handler

Handler timeoutHandler = new Handler(); 
timeoutHandler.postDelayed(new Runnable() { 
    public void run() { 
     stopSelf(); 
    } 
}, 60 * 1000); 
+0

我把它放在我的類的onCreate,我得到錯誤: <匿名aaaGPSTrackingService $ 1>不是抽象和 – katit 2011-04-11 17:02:32

+0

不重寫抽象方法的run()哎呀,那應該是'public void run()',當然沒有摘要。抱歉。順便說一下,'Handler'使用當前線程的'MessageQueue',與'Timer'相反,它創建了一個單獨的線程。你的旅費可能會改變。 – onitake 2011-04-13 10:27:04

+0

謝謝!這效果更好..我剛剛被Timer咬了,而且它運行在不同的線程上。我在服務中有一些終止代碼,並且只有在定時器上調用時纔會出現「looper」錯誤。很高興我回頭看 - 現在有道理。 – katit 2011-05-04 03:23:12

2

你可以使用TimerTimerTask如下安排超時...

中聲明你的服務的全球Timer對象引用:

Timer timeout = null; 

在onStartCommand()中,實例化此Timer並安排TimerTask在一分鐘內執行。爲此,您已經註冊了從所需提供位置更新後:

timeout = new Timer(); 
timeout.schedule(timeoutTask, 60000); 

定義timeoutTask在你的服務類如某處:

private TimerTask timeoutTask = new TimerTask() { 
    public void run() { 
     // Handle timeouts here 
    } 
} 

如果你通過onLocationChanged(回調定時器之前)到期時,你要被執行停止timeoutTask,所以裏面onLocationChanged():

if(timeout != null) { 
    timeout.cancel() 
} 

然後,只需辦理內onLocationChanged您的位置()正常情況下,或者打電話給另一種方法去做,直到你。

有可能有更好的方法來做到這一點,但這是直接的,並已在我的項目上爲我工作:)希望它也可以幫助你。

一切順利, 德克蘭

相關問題