2012-03-13 134 views
2

是否可以請求位於與調用startService的線程不同的線程中的服務內的位置更新?位置服務器內部服務

我曾嘗試:

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); 

它不斷給我的錯誤:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

可以在在一個單獨的線程,或做外景經理需要的服務中後臺管理程序運行從活動中調用?

回答

3

您不必在主線程上收到更新,但您必須擁有有效的Looper底層服務可以使用該服務將回調傳遞到內部Handler。本質上,如果你在主線程上做了所有事情,那麼這個線程已經連接了一個活動的Looper

查看Looper的文檔,因爲它們解釋瞭如何使用有效的實例設置後臺線程,因此可用於此目的。還有一個requestLocationUpdates()版本需要Looper對象。您可以調用requestLocationUpdates(),同時傳遞Looper.getMainLooper()的結果以允許在主線程上處理回調,即使您可能無法直接從該線程附加偵聽器。

另外,請記住,位置更新本質上是異步的,並且不會因爲您在那裏註冊回調而阻塞主線程。這可能不是你對此感興趣的原因,但我認爲值得一提。

HTH

2

我發現,如果從服務以這種方式撥打requestLocationUpdates

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, myLoclistener, Looper.getMainLooper()); 

然後你會,如果你從活動中調用它獲得相同的行爲!

+0

'Looper.getMainLooper()'做到了;確保在線程中使用它 – msysmilu 2015-04-14 14:48:30