4

我正在使用网络位置提供商。我需要每 1 小时从我的LocationListener调用一次 onLocationChanged方法。这是我的代码:

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

但它不起作用。我onLocationChanged经常打电话。

我必须使用哪些参数?

4

1 回答 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()方法从新线程(例如 HandlerThread)提供特定的 Looper。

于 2012-10-26T20:14:23.897 回答