位置更新,提供用于计算距离的随机数

wfveoks0  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(317)

我目前正尝试在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中的输出如下所示

2lpgd968

2lpgd9681#

我有两个想法。
我读了你的代码,你把英里换算成米就行了。
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.-另一个可能的问题可能是并发问题,但您需要发布更多关于代码的信息。

相关问题