4

ネットワーク ロケーション プロバイダーを使用しています。LocationListenerからonLocationChangedメソッドを呼び出す必要があるのは、 1 時間に 1 回だけです。これが私のコードです:

MyLocationListener locationListener = new MyLocationListener();   
locationMangaer.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 3600000, 0,locationListener);

しかし、うまくいきません。私のonLocationChanged呼びかけは非常に頻繁です。

どのパラメーターを使用する必要がありますか?

4

1 に答える 1

11

LocationManager#requestLocationUpdates()ドキュメントから:

Jellybean より前は、minTime パラメーターは単なるヒントであり、一部のロケーション プロバイダーの実装では無視されていました。Jellybean 以降では、Android 互換デバイスで minTime パラメーターと minDistance パラメーターの両方を監視することが必須です。

ただしrequestSingleUpdate()、ルーパーとハンドラーを使用して、1 時間に 1 回更新を実行できます。


追加まず、ここでルーパーとハンドラー
の詳細を読むことができます。

良い選択である API 8 を使用していますが、これにより、呼び出すことができる LocationManager メソッドが制限されます。これは、ほとんどが API 9 で導入されたためです。API 8 には、次の 3 つのメソッドしかありません。

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

最初の方法を使用しましょう。これは最も簡単です。

最初に、通常どおり LocationManager と LocationListener を作成しますが、それ以上の更新の要求をonLocationChanged() 停止します。

@Override
public void onLocationChanged(Location location) {
    mLocationManager.removeUpdates(mLocationListener);
    // Use this one location however you please
}

次に、いくつかの新しいクラス変数を作成します。

private Handler mHandler = new Handler();
private Runnable onRequestLocation = new Runnable() {
    @Override
    public void run() {
        // Ask for a location
        mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListener);
        // Run this again in an hour
        mHandler.postDelayed(onRequestLocation, DateUtils.HOUR_IN_MILLIS);
    }
};

もちろん、バックグラウンドで未使用の更新を取得して LocationManager がリソースを浪費するのを防ぐために、ですべてのコールバックを無効onPause()にして再度有効にする必要があります。onResume()


より技術的なポイント:
LocationManager で UI スレッドをブロックすることを懸念している場合は、2 番目のrequestLocationUpdates()方法を使用して、新しいスレッド (たとえば、HandlerThread) から特定のルーパーを提供できます。

于 2012-10-26T20:14:23.897 に答える