2

这是一个与 LocationManager 相关的效率问题(更普遍的是,在 Android 中管理内存与 CPU 使用情况)。假设我有一个长期运行的服务,它希望每 60 秒使用一次 LocationManager 的 getLastKnownLocation 方法来更新位置。该服务使用一个 TimerTask 和一个 Time 重复固定延迟执行。是创建一个实例字段 mLocationManager 并在服务的生命周期内保留它更好,还是在 TimerTask 的每次执行时实例化 LocationManager 更好,据说 VM 只会在需要时保留它?在代码中:

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
   }
}

注意:我不需要 LocationListener 来保持 GPS 处于活动状态。这是在应用程序的另一部分使用单独的服务处理的。在这里,我只想以固定的时间间隔检查最近的已知位置。

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 回答