我正在使用网络位置提供商。 我需要每1小时从我的 LocationListener 调用 onLocationChanged 方法。 这是我的代码:
MyLocationListener locationListener = new MyLocationListener();
locationMangaer.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 3600000, 0,locationListener);
但它不起作用。我的onLocationChanged
经常打电话。
我必须使用哪些参数?
答案 0 :(得分:11)
来自LocationManager#requestLocationUpdates()
文档:
在Jellybean之前,minTime参数只是一个提示,一些位置提供程序实现忽略了它。从Jellybean开始,Android兼容设备必须同时观察minTime和minDistance参数。
但是,您可以使用requestSingleUpdate()
与Looper和Handler一起运行更新一次。
<强>加成强>
首先,您可以阅读有关Loopers and Handlers here的更多信息。
您正在使用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。