2

これは LocationManager (より一般的には Android でのメモリと CPU の使用量の管理) に関連する効率性の問題です。ロケーションを更新するために、LocationManager の getLastKnownLocation メソッドを 60 秒ごとに使用したい長期サービスがあるとします。このサービスは、固定遅延実行を繰り返す TimerTask と Time を使用します。インスタンス フィールド mLocationManager を作成し、それをサービスの存続期間中保持する方が良いですか、それとも、VM が必要な間だけ保持すると思われる場合に、TimerTask の実行ごとに LocationManager をインスタンス化する方が良いですか? コード内:

public class ProximityService extends Service {

    private LocationManager mLocationManager;

    @Override
    public void onCreate() {
        mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        Timer timer = new Timer();
        TimerTask mGetLastKnownLocationTask = new GetLastKnownLocationTask();
        timer.schedule(mGetLastKnownLocationTask, 0, 60000);
    }

    private class GetLastKnownLocationTask extends TimerTask {

       public void run() {
           Location mLocation = 
               mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
               // Do something with mLocation
       }
    }
...
}

対。

...

@Override
public void onCreate() {
    Timer timer = new Timer();
    TimerTask mGetLastKnownLocationTask = new GetLastKnownLocationTask();
    timer.schedule(mGetLastKnownLocationTask, 0, 60000);
}

private class GetLastKnownLocationTask extends TimerTask {

   public void run() {
       LocationManager mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
       Location mLocation = 
           mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
           // Do something with mLocation
   }
}

注: GPS をアクティブに保つために LocationListener は必要ありません。これは、別のサービスを使用してアプリケーションの別の部分で処理されます。ここでは、一定の間隔で最新の既知の場所のみを確認したいと考えています。

4

1 に答える 1

0

一度ロケーション マネージャーを取得してから、パッシブ ロケーション リスナーを登録する方がよいのではないでしょうか。getLastKnownLocation() を呼び出さなければならないことは、必ずしも繰り返し使用するためではなく、有効な位置情報を取得する時間がない場合の迅速な解決策であると考えられています。

お気に入り...

    LocationManager lm = (LocationManager)  getSystemService(Context.LOCATION_SERVICE);
    //change best provider to a passive location service.
    String bestProvider = lm.getBestProvider(new Criteria(), true);
    if(bestProvider!=null){
       lm.requestLocationUpdates(bestProvider, 1000 * 60 * 15 ,5000, 
       new LocationListener {

        public void onLocationChanged(Location location) {

        }

        public void onProviderDisabled(String provider) {}

        public void onProviderEnabled(String provider) {}

        public void onStatusChanged(String provider, int status, Bundle extras) {}
        }
        );

    }
于 2012-08-13T13:34:21.790 に答える