【问题标题】:The locationListener is only invoked oncelocationListener 只被调用一次
【发布时间】:2012-09-26 08:34:41
【问题描述】:

我想每 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 在它的doInBackground() 方法中使用httpclient,所以它非常简单。

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

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

【问题讨论】:

    标签: android geolocation android-asynctask locationlistener


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      请参阅this。

      当LocationListener 实现为anonymous class 时,它会按预期工作。

      【讨论】:

      • 好的,匿名内部类的技巧已经奏效,每次 GPS(模拟)更新都会调用监听器。另一方面, minTime 似乎被忽略了。是否有可能以某种方式强制它?
      • 请参阅stackoverflow.com/questions/6442093/…,如果它可以解决您的问题。
      • 我看了看...在我的情况下,我需要向服务器发送“保持活动”信号,即使位置没有改变 - 只要应用程序是跑步。也许车辆陷入交通堵塞或只是停下来,但驾驶员希望从服务器接收状态更新。我可以设置一个后台服务来“ping”一个服务器,但是让这两个进程不发生冲突会很痛苦。
      • 是否可以“拉皮条” locationManager 定期调用 listener.onLocationChanged() ?在 javadoc 中:“位置更新之间的经过时间永远不会少于 minTime,尽管它可能更多取决于位置提供程序的实现”
      【解决方案3】:

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-04
        • 2019-08-23
        • 2017-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多