位置更新为计算距离提供随机数
Location Updates giving random numbers for calculating distance
我目前正尝试在 Android Studio 上开发一个 运行 跟踪器,我正在使用常规技术来获取距离,然后将其转换为英里而不是米,我在服务内部进行。但是,当我启动模拟路线时,它开始喷出随机的长数字。我知道这与我如何使用 distanceTo() 计算距离有关,但不知道如何修复它。没有贴出全部代码,相关部分都吹
@Override
public void onCreate() {
super.onCreate();
Log.d("G53", "onCreate called");
locationListener = new MyLocationListener();
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
try {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5, 5, locationListener);
location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
oldLocation = location;
} catch (SecurityException e) {
Log.d("g53mdp", e.toString());
}
}
public double getDistance() {
if(running) {
distance = distance * 0.000621371192;
Log.d("tag", " " + distance);
return distance;
}
return 0;
}
public void startExercise() {
Log.d("tag", "startExercise called");
startTime = System.currentTimeMillis();
stopTime = 0;
running = true;
distance = 0;
}
public void stopExercise() {
Log.d("tag", "stopExercise called");
running = false;
startTime = 0;
}
public class MyLocationListener extends Binder implements LocationListener, IInterface {
@Override
public void onLocationChanged(Location location) {
if(running) {
distanceInMetres = oldLocation.distanceTo(location);
if (distanceInMetres < 10) {
Log.i("DISTANCE", "Values too close, so not used.");
} else {
distance += distanceInMetres;
oldLocation = location;
}
}
}
Logcat 中的输出如下所示
我有两个想法。
我看了你的代码,你把英里换算成米没问题。
1.- 我认为问题是您在 2 种或多种方法中重新利用距离变量,造成溢出。
您在此处添加距离。
distance += distanceInMetres;
这很完美,但随后您读取了该变量并在
中为它们分配了一个新值
public double getDistance() {
if(running) {
distance = distance * 0.000621371192;
Log.d("tag", " " + distance);
return distance;
}
return 0;
}
所以我建议你把getDistance()
改成
public double getDistance() {
if(running) {
return distance * 0.000621371192;
}
return 0;
}
这样,您就不会重新分配值。
2.- 另一个可能的问题可能是并发问题,但您需要 post 更多关于要遵循的代码。
我目前正尝试在 Android Studio 上开发一个 运行 跟踪器,我正在使用常规技术来获取距离,然后将其转换为英里而不是米,我在服务内部进行。但是,当我启动模拟路线时,它开始喷出随机的长数字。我知道这与我如何使用 distanceTo() 计算距离有关,但不知道如何修复它。没有贴出全部代码,相关部分都吹
@Override
public void onCreate() {
super.onCreate();
Log.d("G53", "onCreate called");
locationListener = new MyLocationListener();
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
try {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5, 5, locationListener);
location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
oldLocation = location;
} catch (SecurityException e) {
Log.d("g53mdp", e.toString());
}
}
public double getDistance() {
if(running) {
distance = distance * 0.000621371192;
Log.d("tag", " " + distance);
return distance;
}
return 0;
}
public void startExercise() {
Log.d("tag", "startExercise called");
startTime = System.currentTimeMillis();
stopTime = 0;
running = true;
distance = 0;
}
public void stopExercise() {
Log.d("tag", "stopExercise called");
running = false;
startTime = 0;
}
public class MyLocationListener extends Binder implements LocationListener, IInterface {
@Override
public void onLocationChanged(Location location) {
if(running) {
distanceInMetres = oldLocation.distanceTo(location);
if (distanceInMetres < 10) {
Log.i("DISTANCE", "Values too close, so not used.");
} else {
distance += distanceInMetres;
oldLocation = location;
}
}
}
Logcat 中的输出如下所示
我有两个想法。
我看了你的代码,你把英里换算成米没问题。
1.- 我认为问题是您在 2 种或多种方法中重新利用距离变量,造成溢出。
您在此处添加距离。
distance += distanceInMetres;
这很完美,但随后您读取了该变量并在
中为它们分配了一个新值public double getDistance() {
if(running) {
distance = distance * 0.000621371192;
Log.d("tag", " " + distance);
return distance;
}
return 0;
}
所以我建议你把getDistance()
改成
public double getDistance() {
if(running) {
return distance * 0.000621371192;
}
return 0;
}
这样,您就不会重新分配值。
2.- 另一个可能的问题可能是并发问题,但您需要 post 更多关于要遵循的代码。