2012-10-26 66 views
3

我正在使用网络位置提供程序。 我需要拨打onLocationChanged方法从我的位置监听器每1小时只有一次。 这是我的代码:Android位置侦听器经常拨打

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

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

我必须使用哪些参数?

回答

10

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 )。

+0

谢谢你......也许你可以给我一些Looper和Handler例子的链接? –

+0

首先,您使用的最小API是多少? (8,10,16?) – Sam

+0

我正在使用minSdkVersion =“8” –