2012-11-15 15 views
1

存在開始從與以下方法的LocationManager獲取通知的可能性:安卓的LocationManager構造的尺蠖

requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener, Looper looper) 

文檔解釋了這句話的屬性:

provider the name of the provider with which to register 
minTime  minimum time interval between location updates, in milliseconds 
minDistance minimum distance between location updates, in meters 
listener a LocationListener whose onLocationChanged(Location) method will be called for each location update 
looper  a Looper object whose message queue will be used to implement the callback mechanism, or null to make callbacks on the calling thread 

我不明白井如果我想用這種方法開始接收更新,則該類(的活套)的行爲。此外,我正在圍繞類LocationManager創建一個庫,並且在執行正常行爲之前,我需要做一些其他工作。比我需要的是開始接收對庫的LocationListener的更新,並且只有在某些條件被驗證時才執行正常的行爲。

爲了做到這一點,我需要知道如何模擬如果用戶開始使用上述方法接收更新時具有LocationManager的行爲。

我希望我很清楚。 有人可以幫我嗎?謝謝!

回答

10

一個Looper基本上是一個在後臺運行的線程,每當它從Handler對象接收到消息或可運行時都會工作。主要的looper是UI線程的一部分。其他loopers通常通過構造新的HandlerThread,然後調用thread.start(),然後調用thread.getLooper()來創建。

LocationManager允許您使用特定的Looper或主Looper(UI線程)請求位置。

requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener, Looper looper) 

或致電

requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener) 

內部在Android的定位管理它建立了一個ListenerTransport對象所提供的彎針或在主線程創建一個處理程序。如果沒有提供。該處理程序接收來自LocationManager提供程序的偵聽器事件。

當您想要在AsyncTask中處理位置管理器事件,或者如果要在偵聽器中執行長時間運行的操作並避免阻塞UI線程時,通常您會使用Looper請求更新偵聽器。一個簡單的例子如下:

HandlerThread t = new HandlerThread("my handlerthread"); 
t.start(); 
locationManager.requestLocationUpdates(locationManager.getBestProvider(), 1000l, 0.0f, listener, t.getLooper()); 

在您LocationLiistener

Handler MAIN_HANDLER = new Handler(Looper.getMainLooper()); 
@Override 
public void onLocationChanged(Location location) { 
    final MyPojoResult result = doSomeLongRuningOperation(location); 
    MAIN_HANDLER.post(new Runnable() { 
     @Override 
     public void run() { 
      doSomeOperationOnUIThread(result): 
     } 
    }); 
} 
+1

什麼是'MAIN_HANDLER'在做什麼?來自你傳遞給UI線程的'result'的位置在哪裏? – Suhas

+0

主處理程序接收runnable並在ui/main應用程序線程中執行它。 –