从LocationManager#requestLocationUpdates()
文档:
此前杰利贝恩的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 )。
来源
2012-10-26 20:14:23
Sam
谢谢你......也许你可以给我一些Looper和Handler例子的链接? –
首先,您使用的最小API是多少? (8,10,16?) – Sam
我正在使用minSdkVersion =“8” –