0

デバイスの GPS 位置のトレースを 2 分ごとに保存する必要があるアプリケーションを開発しています。
最初の試みはrequestLocationUpdatesを使用することでした:

locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 120000L, 0f, this);

テストには、Samsung Galaxy Mini (Android 2.3.5)を使用します。
USB ケーブルを接続してデバッグ モードでテストを行うと、すべてが完璧に機能し、2 分ごとに位置が取得されます。
問題は、USB を抜いて通りに出てテストするときです。このようにして、毎秒 GPS 位置を取得します。これは、やりすぎ。
コードをよく見直した後、タイマーを使用することにしました。

new Timer().scheduleAtFixedRate(new TimerTask(){
    @Override
    public void run() {
        Location loc=getLastBestLocation(Activity.this);
        GpsStore.save(loc);
    }   
}, 120000L, 120000L);

ここでも、USB ケーブルを使用してアプリケーションをデバッグ モードでテストすると、すべてがうまくいきます。
アプリケーションがフォアグラウンドにある場合はすべてうまくいきます。アプリケーションがバックグラウンドにある場合、TimerTask は 2 分ごとに実行されず、停止し、アプリケーションがフォアグラウンドに戻ると突然実行されます。 TimerTask は正常に実行されていました。しかし、すべてが約 1 秒ですばやく完了します。

繰り返しますが、コードをよく見直した後、Timer Handler の代わりに使用することにしました。

        final Handler handler = new Handler();
        Runnable runnable = new Runnable() {
           public void run() {
                                    Location loc=getLastBestLocation(Activity.this);
                                    GpsStore.save(loc);

                handler.removeCallbacks(this);
                handler.postDelayed(this,120000L);
           }
        };
        handler.removeCallbacks(runnable);
        handler.postDelayed(runnable, 120000L);

いつものように、USB を使用したデバッグ モードではすべて正常に動作します。路上でテストを行ったときに何が起こるかというと、アプリケーションがハンドラーによってフォアグラウンドにあるときは、2 分ごとに正確に実行されないことがありますが、アプリケーションがバックグラウンドにあるときは Runnable を使用してHandler は 2 分ごとに実行されるわけではなく、実行されることはありません。

requestLocationUpdates だけを使用しますが、毎秒呼び出されます。
あなたの助けが必要です。ありがとうございました。

4

1 に答える 1

0

のドキュメントをlocationManager.requestLocationUpdates見ると、minTime引数がヒントとしてのみ使用されていることがわかります。実際の LocationProvider は、指定したよりも早く更新を提供できます。値も設定することをお勧めしますminDistance。100m 以上に設定してください。

于 2012-06-11T16:21:01.283 に答える