在android中使用延迟方法的正确方法



我正在尝试创建一个adndroid应用程序,它将显示我启动该应用程序时的距离。我正在使用位置管理器,这是我的想法:

  1. 检查坐标
  2. (2秒延迟)
  3. Chceck坐标2
  4. 如果坐标2!=然后坐标计算它们之间的距离,并将其添加到两倍的距离中
  5. 重复

    public void onLocationChanged(最终位置){

            sz = location.getLatitude();
            dl = location.getLongitude();
            String dls = String.valueOf(dl);
            String szs = String.valueOf(sz);
            aktualna_dlg.setText(dls);
            aktualna_szg.setText(szs);
            lat1 = location.getLatitude();
            lon1 = location.getLongitude();
            int secs = 2; // Delay in seconds
            Utils.delay(secs, new Utils.DelayCallback() {
                @Override
                public void afterDelay() {
                   lat2 = location.getLatitude();
                   lon2 = location.getLongitude();
                }
            });
            if (lat1!=lat2 || lon1!=lon2){
                distance += DistanceCalculator.distance(lat1,lon1,lat2,lon2, "K");
            }
            if(distance<1000){
                String distance_s = String.valueOf(distance*1000);
                distance_tv.setText(distance_s + " m");
            }
            else if(distance>=1000){
                String distance_s = String.valueOf(distance/1000);
                distance_tv.setText(distance_s + " km");
            }
        }
    

    但当我编译应用程序并捕捉GPS时,我的距离约为6公里。我做错了什么?

我不确定utils.delay做什么,因为它不是框架的一部分。但假设它工作正常,它会延迟发生。这意味着lat2和lon2在调用之前不会更新。所有使用这些变量的代码都必须在afterDelay中发生,在那之前它们都是无效的。

消除延迟,只需将onLocationChanged的参数与上次调用时的参数进行比较。至于你为什么要记录一段巨大的旅程。。。

使用高通滤波器

你希望在2秒内移动多远?可能低于GPS接收器的精度,除非你在飞机上。你的大部分"动作"实际上只是随机的噪音。

在我的一个应用程序中,我将起始GPS位置保存为参考点。每次调用onLocationChanged时,我都会计算当前位置和参考点之间的距离。如果距离大于某个高通值,我会将距离添加到跑步总数中,并将新位置设置为参考点。我使用100米作为我的高通值,因为我在高层建筑周围看到过一些精度为100米或更差的设备。

最新更新