0

目前我正在延迟发送到服务器 gps 位置。位置(经纬度)需要每 3 分钟发送一次,现在出于测试目的,它设置为每 20 秒发送一次,我正在记录坐标只是为了验证输出。这里的问题是,当我在模拟器中对位置进行地理修复时(我没有要测试的设备),记录器类会打印我所有最新的固定位置,而不仅仅是最后一个。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

然后我再修复一个位置:

geo fix 44.44 80.33

输出是:

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

它重复最后三个固定位置。(看输出的时间)。再一次,所需的行为只是固定的最后一个位置。

注意:我用计时器而不是处理程序对此进行了测试,我得到了相同的结果!

所以我的问题是:

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

4

2 回答 2

0

看起来您实际上并没有关闭线程。您是否尝试过不每次都启动一个新的 Runnable?

于 2013-07-02T23:03:20.623 回答
0

看起来您通过两次handler.postDelayed调用将相同的 Runnable 排队两次,因此从 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);
于 2013-07-03T20:02:04.043 回答