locationListener仅调用一次

时间:2012-09-26 08:34:41

标签: android geolocation android-asynctask locationlistener

我希望每隔10秒将一些数据和坐标一起发送到远程服务器。我想,最好的匹配是

public void onCreate( Bundle savedInstanceState ) {
  //snip
  locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 10000, 0, new SendingLocationListener() );
}
在监听器中我有以下代码:

public void onLocationChanged( Location location ) {
  if( null == location ) return;
  TrackerNotifierTask task = new TrackerNotifierTask();
  task.execute( location );
}

TrackerNotifierTask在其httpclient方法中使用doInBackground(),因此非常简单。

现在,如果我开始活动,我可以看到执行onLocationChanged()并且数据成功点击远程服务器。但只有一次!无论我以后做什么,改变坐标或任何东西,任务都不会被调用。

这是在android中实现此类功能的正确方法还是应该使用某些background-service

3 个答案:

答案 0 :(得分:3)

来自Shrikant的链接给了我一些关于LocationListener实现的类结构的提示。

不一定要将类定义为inner anonymous class。我将它定义为内部,但命名为one,它也起作用。

诀窍是,必须将侦听器实例声明为字段:

private LocationListener listener;

@Override
public void onCreate( Bundle savedInstanceState ) {
  //snip
  locationManager = (LocationManager)this.getSystemService( Context.LOCATION_SERVICE );
  listener = new MyLocationListener( SomeActivity.this );
  locationManager.requestLocationUpdates( provider, 1000, 0, listener );
}

否则它将在第一次运行后被垃圾收集,如果定义如下:

locationManager.requestLocationUpdates( provider, 1000, 0, new MyLocationListener() );

这是解决方案的一半。另一部分 - 关于minTime - 仍然没有得到解决。也许它与模拟器有关...我会在找到方法后立即发布缺失的部分。

更新: 似乎,在真实设备上,minInterval似乎会导致听众发射,无论是否改变了坐标

答案 1 :(得分:0)

请参阅this

LocationListener作为anonymous class实施时,它按预期工作。

答案 2 :(得分:0)

我有类似的问题, 当我使用

private LocationListener mLocationListener1 = new LocationListener() {
   @Override
       public void onLocationChanged(Location location) {
       }
}
在我班上, onLocationChanged仅被调用一次, 但在我将“最终”添加到

之后
private final LocationListener mLocationListener1 = new LocationListener() {

问题已解决。 (就我而言,由地面服务人员使用)

好像是
如果未使用final关键字定义变量, 叫了一次之后 它会被垃圾收集,不会再被调用...