【问题标题】:onLocationChanged gets called multiple times on start of applicationonLocationChanged 在应用程序启动时被多次调用
【发布时间】:2017-06-16 19:06:38
【问题描述】:

我写了以下服务,想法是在应用程序启动时将用户位置发送到服务器,当用户旅行超过500m时,问题是在启动时它调用onLocationChanged 3次。

我无法理解它从哪里调用它 3 次。请指导我如何解决此问题。

public class LocationUpdateService extends Service implements
        LocationListener,
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener {



    private static final long BACKGROUND_INTERVAL = 60000;

    final private String TAG = LocationUpdateService.class.getSimpleName();
    private LocationRequest mLocationRequest;
    private GoogleApiClient mGoogleApiClient;
    private String LOCATION_PREF = "LOCATION_PREF";



    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG, "onStartCommand: ");
        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(BACKGROUND_INTERVAL);
        mLocationRequest.setFastestInterval(30000);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
        mLocationRequest.setSmallestDisplacement(500);
        super.onStartCommand(intent, flags, startId);
        return START_STICKY;
    }

    @Override
    public void onLocationChanged(Location location) {
        Log.i("Location Service", "onLocationChanged: " + location.toString());
        saveLocationandReport(String.valueOf(location.getLatitude()), String.valueOf(location.getLongitude()));
    }

【问题讨论】:

    标签: android performance android-layout locationlistener android-fusedlocation


    【解决方案1】:

    您无法控制onLocationChanged,它由定位服务管理。在您的情况下,您可以设置缓冲/等待时间,如果您在缓冲时间内进行位置更新,您可以检查其准确性与以前最好使用它的位置更新比较。

    private int FASTEST_INTERVAL = 1000; // use whatever suits you
    private Location currentLocation = null;
    private long locationUpdatedAt = Long.MIN_VALUE;
    
    @Override
    public void onLocationChanged(Location location) {
        boolean updateLocationandReport = false;
        if(currentLocation == null){
            currentLocation = location;
            locationUpdatedAt = System.currentTimeMillis();
            updateLocationandReport = true;
        } else {
           long secondsElapsed = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - locationUpdatedAt);
           if (secondsElapsed >= TimeUnit.MILLISECONDS.toSeconds(FASTEST_INTERVAL)){
                // check location accuracy here
                currentLocation = location;
                locationUpdatedAt = System.currentTimeMillis();
                updateLocationandReport = true;
           }        
        }
        if(updateLocationandReport){
            //  send your location to server
        }
    }
    

    【讨论】:

      【解决方案2】:

      您无法控制何时调用 onLocationChanged - 它是调用它的位置服务。

      如果出于多种原因,它可能会调用 - 最明显的是当用户实际移动时,它会检测到这一点并向您发送更新,但也可能会在定位服务获得更准确的位置时调用。

      作为一般规则,准确的位置需要一点时间,因此如果您需要准确性,在您的应用程序中允许这样做可能是有意义的。

      【讨论】:

      • 谢谢,我最近需要触发吗?或者第三次点击Hit server,它总是点击服务3次
      • 使用定位对象提供的精度参数,然后你可以据此决定做什么
      • @Ak9637 : getAccuracy 在所有点击中返回 23.33
      • 那么你可以使用某种缓冲区来检查你收到的最后几个位置是否不同或更准确
      • 你可以把逻辑放在saveLocationandReport方法中发送位置
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-05
      相关资源
      最近更新 更多