LocationManager requestLocationUpdates minTime 或 minDistance

LocationManager requestLocationUpdates minTime OR minDistance

我正在使用 Android 的 LocationManager 及其方法 requestLocationUpdates,如下所示:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 10, this);

因为我发现位置更新必须同时满足 minTime 和 minDistance 的条件,但我需要每 3 秒或 10 米更新一次。

我尝试提出 2 个这样的请求:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 0, this);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 10, this);

但它不起作用,我使用此代码每 10 米才更新一次,而不是每 3 秒更新一次。

如果重要的话,我正在使用 API19。

关于 requestLocationUpdate() 的文档说:

requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)

Register for location updates using the named provider, and a pending intent.

所以你应该这样称呼它 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 10, this);

但是如果将 minTime 设置为 0,它将在第一次收到位置更新时调用一次,然后直到您更改 minDistance 米中的位置后才会调用它。

Documentation Link for Reference

编辑

根据与@Matej 的讨论我需要每 10 米更新一次,即使它发生在不到 3 秒内,并且每 3 秒更新一次,即使位置没有改变更多超过10米

如果你想定期requestLocationUpdates,你应该使用TimerTimerTask并且每3秒requestLocationUpdates 运行一次

schedule(TimerTask task, long delay, long period)

Schedules the specified task for repeated fixed-delay execution, beginning after the specified delay.

我阅读了这个关于类似问题的讨论。 我必须每秒更新位置,但设置:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this);

我没有实现我的目标。 在官方文档中我读到,如果你为更新设置了一个时间率,它可能不会像设置的那样严格。 (我再也找不到谈论的开发者页面)。

为了获得固定且确定的更新时间,我发现了这个 post。

我的问题是位置更新去更新(由观察者) activity 并且我在使用 Timer 时出错(如建议的那样)。 错误是:

Only the original thread that created a view hierarchy can touch its views.

对于有类似问题的人,我建议使用处理程序:

Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            notifyLocationObservers();
        }
    }, 1000);