Android Gps延迟定位

Android Gps延迟定位,android,gps,location,Android,Gps,Location,目前我正在延迟发送到服务器gps位置。需要每3分钟发送一次位置(lat和long),现在出于测试目的,它被设置为每20秒发送一次,我记录坐标只是为了验证输出。这里的问题是,当我对模拟器中的位置进行地理定位时(我没有要测试的设备),logger类会打印我所有最新的固定位置,而不仅仅是最后一个。具有postDelayed的处理程序可以工作,这是我的类 此代码来自@kyogs public class LocalizadorGps extends Service { private Locat

目前我正在延迟发送到服务器gps位置。需要每3分钟发送一次位置(lat和long),现在出于测试目的,它被设置为每20秒发送一次,我记录坐标只是为了验证输出。这里的问题是,当我对模拟器中的位置进行地理定位时(我没有要测试的设备),logger类会打印我所有最新的固定位置,而不仅仅是最后一个。具有postDelayed的处理程序可以工作,这是我的类

此代码来自@kyogs

public class LocalizadorGps extends Service {
    private LocationManager mlocmag;
    LocationListener mloclist;
    private  long UPDATE_INTERVAL;
    private double latn,longn;
    public Location loc;

    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        mlocmag = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        mloclist = new MyLocationList();

        loc = mlocmag.getLastKnownLocation(LocationManager.GPS_PROVIDER);

        if (loc == null) {
            loc = mlocmag.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        }

        updateServer(loc);
        mlocmag.requestLocationUpdates(LocationManager.GPS_PROVIDER, 20000, 1000,mloclist);


    }

    public void updateServer(final Location loc) {
        final Handler handler = new Handler();

        Runnable runnable = new Runnable() {
            public void run() {
                if (loc != null) {
                    final double latitude = loc.getLatitude();
                    final double longitude = loc.getLongitude();
                    Log.v("COORDINATES", Double.toString(latitude) + " " + Double.toString(longitude));
                } else {
                    System.out.println("Location not avilable");
                }

                handler.postDelayed(this, 20000);
            }
        };
        handler.postDelayed(runnable, 20000);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mlocmag.removeUpdates(mloclist);
    }

    @Override
    public boolean stopService(Intent name) {
        return super.stopService(name);
    }

    public class MyLocationList implements LocationListener {

        public void onLocationChanged(Location location) {
            updateServer(location);
        }

        public void onProviderDisabled(String provider) {

        }

        public void onProviderEnabled(String provider) {

        }

        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

    }
}
我正在这样做:

geo fix 44.41 56.75
输出为:

06-27 04:03:55.736  13743-13743/com.example.testingui          
V/COORDINATES: 56.75 44.409998333333334
06-27 04:04:15.756  13743-13743/com.example.testingui          
V/COORDINATES: 56.75 44.409998333333334
06-27 04:04:19.725  13743-13743/com.example.testingui          
V/COORDINATES: 80.32999833333334 44.43999833333334
然后我再确定一个位置:

geo fix 44.44 80.33
输出为:

06-27 04:03:55.736  13743-13743/com.example.testingui          
V/COORDINATES: 56.75 44.409998333333334
06-27 04:04:15.756  13743-13743/com.example.testingui          
V/COORDINATES: 56.75 44.409998333333334
06-27 04:04:19.725  13743-13743/com.example.testingui          
V/COORDINATES: 80.32999833333334 44.43999833333334
它重复以前固定的位置和新的位置。所需的行为只是最后一个位置

最后一点:

geo fix 44.44 33.67
输出:

06-27 04:04:35.767  13743-13743/com.example.testingui          
V/COORDINATES: 56.75 44.409998333333334
06-27 04:04:39.686  13743-13743/com.example.testingui          
V/COORDINATES: 33.669999999999995 44.43999833333334
06-27 04:04:39.736  13743-13743/com.example.testingui          
V/COORDINATES: 80.32999833333334 44.43999833333334
它重复最后三个固定位置。(查看输出的时间)。再一次,期望的行为只是最后一个固定的位置

注意:我用计时器而不是处理程序测试了这一点,得到了相同的结果

所以我的问题是:


我做错什么了吗?我找不到问题:(.

看起来你并不是真的在关闭线程。你有没有尝试过每次都不启动一个新的Runnable?

看起来你通过两个
处理程序将同一个Runnable排队两次。postDelayed
调用,所以第二个从Runnable.run()中排队)正在回显同一Runnable的第一次执行的相同输出

此代码:

Runnable runnable = new Runnable() {
        public void run() {
            if (loc != null) {
                final double latitude = loc.getLatitude();
                final double longitude = loc.getLongitude();
                Log.v("COORDINATES", Double.toString(latitude) + " " + Double.toString(longitude));
            } else {
                System.out.println("Location not avilable");
            }

            handler.postDelayed(this, 20000);
        }
    };
    handler.postDelayed(runnable, 20000);
…应改为:

Runnable runnable = new Runnable() {
        public void run() {
            if (loc != null) {
                final double latitude = loc.getLatitude();
                final double longitude = loc.getLongitude();
                Log.v("COORDINATES", Double.toString(latitude) + " " + Double.toString(longitude));
            } else {
                System.out.println("Location not avilable");
            }
        }
    };
    handler.postDelayed(runnable, 20000);

所以我没有尝试。我在runnable结束后添加了handler.removeCallbacks(runnable);但它似乎不起作用。我得到了相同的输出。只是好奇为什么要在UpdateServer()函数中的位置变量中使用
final
关键字?