Посмотрите на этом примере:интеллектуального расстояние вычисления между двумя точками гео в андроиде
public void start(){
//...
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, TEN_SECONDS, TEN_METERS, this);
}
@Override
public void onLocationChanged(Location location) {
if(location.distanceTo(_lastLocation) > TEN_KM_IN_METERS){
actionA(location);
_lastLocation = location;
} else {
actionB(location);
}
}
Реализация Location#distanceTo(l)
является довольно сложной и ресурсоемким. Поэтому я не хочу вызывать эту операцию при каждом обновлении местоположения.
Вопрос: стоит ли надлежащим образом, чтобы избежать ненужныхLocation#distanceTo(l)
звонки
Что я пытался до сих пор. По Wiki - Decimal degrees я сделать это таким образом:
private boolean closeTogether(Location a, Location b) {
double changeLat = Math.abs(a.getLatitude() - b.getLatitude());
final float myNaiveMax = 0.005;
if (changeLat > myNaiveMax) {
return false;
}
double changeLon = Math.abs(a.getLongitude() - b.getLongitude());
if (changeLon > myNaiveMax) {
return false;
}
return true;
}
@Override
public void onLocationChanged(Location location) {
if(!closeTogether(location, _lastLocation) && location.distanceTo(_lastLocation) > TEN_KM_IN_METERS){
actionA(location);
_lastLocation = location;
} else {
actionB(location);
}
}
благодаря спариванию, именно то, что мне было нужно –