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
方法以发送位置