2

次の方法で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が実行する動作をシミュレートする方法を知る必要があります。

はっきりしているといいのですが。誰かが私を助けることができますか?ありがとう!

4

1 に答える 1

13

Looper は基本的にバックグラウンドで実行されるスレッドであり、Handler オブジェクトからメッセージまたは runnable を受け取るたびに機能します。メイン ルーパーは UI スレッドの一部です。他のルーパーは、通常、new 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 Location Manager で ListenerTransport オブジェクトを設定して、提供されたルーパーの Handler を作成するか、何も提供されていない場合はメイン スレッドに作成します。このハンドラーは、LocationManager プロバイダーからリスナー イベントを受け取ります。

通常、AsyncTask 内でロケーション マネージャー イベントを処理する場合、またはリスナー内で長時間実行される操作を実行し、UI スレッドのブロックを回避する場合は、ルーパーを使用してリスナーに更新を要求します。簡単な例を次に示します。

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

あなたの LocationListener 内

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):
        }
     });
}
于 2014-11-03T14:09:20.293 に答える