2010-04-06 86 views
5

使用我的Android應用程序,當用戶執行某個動作時,會啓動一個後臺服務,獲取當前的GPS位置並將其保存在數據庫中,並執行其他操作。在該服務中,我使用LocationManager類中的requestLocationUpdates(),並等待我的LocationListener(由服務實現)的onLocationChanged()被觸發。但等待onLocationChanged開火的最佳方法是什麼?我應該只是輪詢一個變量,並等待它被設置?有小費嗎?什麼是等待GPS定位的最佳方式?

注意:由於其他原因,我不能簡單地將數據寫入onLocationChanged()

編輯:爲了清楚我的情況,我可以舉一個類似於我的情況的例子: 假設用戶按下一個按鈕,並且方法myMethod被觸發,它將返回一些對象。然後,在此myMethod中,我將註冊GPS的位置更新(使用requestLocationChanged),並等待用戶位置並將其用於某些事情。換句話說,myMethod在位置出現之前不能返回。在這種情況下,我不知道如何使用onLocationChanged

回答

3

當位置被設置時,onLocationChanged被觸發,所以你不需要輪詢任何變量。爲什麼你不能在onLocationChanged中保存位置?

+1

可能是因爲GPS偵聽器在後臺服務,而不是他的主要過程。 – Segfault 2010-04-06 14:34:58

+0

當用戶執行觸發位置獲取服務的動作時,我的應用程序應該在繼續前獲取當前位置。比方說,用戶按下一個按鈕,一個方法myMethod被觸發,這將返回一些對象。然後,在這個myMethod中,我將註冊GPS的位置更新(使用requestLocationChanged),另外等待用戶的位置並將其用於某些事情。換句話說,myMethod在位置出現之前不能返回。我不知道如何在這種情況下使用onLocationChanged。 – qtips 2010-04-06 16:09:36

+1

所以你想在myMethod中暫停執行,同時等待gps同步並給你一個位置?你不應該那樣做。如果這是你需要做的事情,你應該顯示一個進度對話框,當onLocationChanged被觸發時它將被解散。然後在onLocationChanged中完成myMethod需要處理的位置。 – 2010-04-07 13:45:56

0

我所做的是將主屏幕上的視圖設置爲不確定長度的進度條,設置requestLocationUpdates()並返回給用戶。如果您需要阻止用戶,直到該位置得到解決,那麼您可以在沒有控件和進度欄視圖的活動頂部打開一個對話框。然後在onLocationChanged回調中,您可以關閉該對話框並繼續進行業務。

編輯:我再次讀你的問題,我想我更好理解。我的第一個建議是看看你是否可以放棄你的後臺服務。由於GPS API是異步的,您不必擔心等待GPS鎖定時應用程序無響應。如果因爲任何原因無法使用,那麼您必須查看消息傳遞API,以便在GPS數據可用時允許後臺服務向主Activity發送消息。 See the Developers guide

0

我想你應該使用wait/notify方法。你應該有一些鎖對象。你可以在你的方法中調用lockObject.wait()。你可以在onLocationChanged中調用lockObject.notify()。這樣,只有收到onLocationChanged後,方法纔會返回。

實際上,更好的解決方案是檢查您的設計,並在可能的情況下使您的方法異步。

0

根據我對該問題的理解和閱讀意見,我建議你採用LocationManager班的getLastKnownLocation()的初始位置。還註冊了onLocationChanged事件。現在你可以在這個事件處理函數中做任何你想要的東西,同時在前端進行。另外,如果您需要當前位置,則可能需要等待requestLocationUpdates()作出響應。在您的應用程序準備完成某項任務時,讓用戶等待可能不是一個好主意。正如其他人所建議的那樣,您可以在這裏使用進度條。

相關問題