Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android onLocationChanged在应用程序启动时被多次调用_Android_Performance_Android Layout_Locationlistener_Android Fusedlocation - Fatal编程技术网

Android onLocationChanged在应用程序启动时被多次调用

Android onLocationChanged在应用程序启动时被多次调用,android,performance,android-layout,locationlistener,android-fusedlocation,Android,Performance,Android Layout,Locationlistener,Android Fusedlocation,我编写了以下服务,其目的是在应用程序启动时将用户位置发送到服务器,当用户行程超过500米时,问题是在启动时它调用onLocationChanged3次 我无法理解它在哪里叫了三次。请指导我如何解决这个问题 public class LocationUpdateService extends Service implements LocationListener, GoogleApiClient.ConnectionCallbacks, Google

我编写了以下服务,其目的是在应用程序启动时将用户位置发送到服务器,当用户行程超过
500米时,问题是在启动时它调用
onLocationChanged
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()));
    }

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

它可能会调用if,原因有很多——最明显的是当用户实际移动时,它会检测到这一点并向您发送更新,但当位置服务获得更准确的位置时,也可能会调用它


一般来说,精确定位需要一点时间,因此,如果您需要精确定位,在应用程序中考虑到这一点可能是有意义的。

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

它可能会调用if,原因有很多——最明显的是当用户实际移动时,它会检测到这一点并向您发送更新,但当位置服务获得更准确的位置时,也可能会调用它


一般来说,精确定位需要一点时间,因此如果您需要精确定位,在应用程序中考虑到这一点可能是有意义的。

您无法控制
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
    }
}

您无法控制
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
    }
}

谢谢,那么我最近需要触发它吗?或者在第三次尝试时命中服务器,它总是三次命中服务使用location对象提供的精度参数,然后基于此,你可以决定做什么do@Ak9637:getAccuracy在所有命中时返回23.33您可以使用某种缓冲区来检查您收到的最后几个位置是否更准确您可以将逻辑放入
saveLocationandReport
方法来发送位置谢谢,那么我最近需要触发它吗?或者在第三次尝试时命中服务器,它总是三次命中服务使用location对象提供的精度参数,然后基于此,你可以决定做什么do@Ak9637:getAccuracy在所有命中时返回23.33您可以使用某种缓冲区来检查它您收到的最后几个位置是否更准确您可以将逻辑放入
saveLocationandReport
方法以发送位置