1

我想每 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方法,所以很简单。httpclientdoInBackground()

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

这是在android中实现这种东西的正确方法还是我应该求助于一些background-service

4

3 回答 3

3

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

类不一定必须定义为inner anonymous class. 我将它定义为内部,但命名为一个,它也有效。

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

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 似乎会导致侦听器触发,无论坐标是否更改

于 2012-09-26T12:09:30.833 回答
0

请看这个

LocationListener实现为anonymous class.

于 2012-09-26T08:45:45.410 回答
0

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

private LocationListener mLocationListener1 = new LocationListener() {
   @Override
       public void onLocationChanged(Location location) {
       }
}

在我的课堂上,onLocationChanged 只被调用一次,但是在我添加“final”之后

private final LocationListener mLocationListener1 = new LocationListener() {

问题已经解决了。(在我的情况下,由前台服务使用)

看起来
如果变量没有用 final 关键字定义,在它被调用一次之后,它将被垃圾收集并且不会再次被调用......

于 2018-11-18T12:47:28.337 回答