Android位置监听器调用非常频繁。

4

我正在使用网络定位提供程序。 我需要从我的LocationListener中每小时只调用一次onLocationChanged方法。 以下是我的代码:

MyLocationListener locationListener = new MyLocationListener();   
locationMangaer.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 3600000, 0,locationListener);

但是它不起作用。我的onLocationChanged调用非常频繁。 我应该使用哪些参数?
1个回答

11

根据LocationManager#requestLocationUpdates()文档:

在Jellybean版本之前,minTime参数只是一个提示,一些位置提供程序的实现会忽略它。从Jellybean版本开始,Android兼容设备必须遵守minTime和minDistance两个参数。

但你可以使用requestSingleUpdate()与Looper和Handler来每小时运行一次更新。


补充
首先,您可以在此处了解有关Loopers和Handlers的更多信息

您正在使用API 8版本,这是一个不错的选择,但这限制了我们可以调用哪些LocationManager方法,因为大多数方法是在API 9中引入的。API 8仅有这三个方法:

requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)
requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener, Looper looper)
requestLocationUpdates(String provider, long minTime, float minDistance, PendingIntent intent)

让我们使用第一种方法,这是最简单的。

首先,像往常一样创建您的LocationManager和LocationListener,但在onLocationChanged()停止请求更多的更新:

@Override
public void onLocationChanged(Location location) {
    mLocationManager.removeUpdates(mLocationListener);
    // Use this one location however you please
}

其次,创建一些新的类变量:

private Handler mHandler = new Handler();
private Runnable onRequestLocation = new Runnable() {
    @Override
    public void run() {
        // Ask for a location
        mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListener);
        // Run this again in an hour
        mHandler.postDelayed(onRequestLocation, DateUtils.HOUR_IN_MILLIS);
    }
};

当然,你应该在 onPause() 中禁用所有回调函数,在 onResume() 中重新启用它们,以防止 LocationManager 在后台获取未使用的更新而浪费资源。
更多技术细节:
如果你担心使用 LocationManager 会阻塞 UI 线程,那么你可以使用第二个 requestLocationUpdates() 方法提供一个特定的 Looper 来自新线程(比如 HandlerThread)。

谢谢...也许你可以给我一些Looper和Handler的示例链接吗? - Victoria Seniuk
首先,您使用的最低API是多少?(8、10、16?) - Sam
为了便于未来的读者完整理解,Sam最后提到的技术点“关注使用LocationManager堵塞UI线程”,他指的是相关LocationListener回调(如onLocationChanged())。请注意,LocationManager.requestLocationUpdates()方法不会阻塞,调用它并不足以涉及Loopers和Handlers。 - varun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接