【问题标题】:can not setInterval in onLocationChanged无法在 onLocationChanged 中设置Interval
【发布时间】:2014-06-13 00:18:35
【问题描述】:

我正在尝试来自 http://developer.android.com/training/location/receive-location-updates.html 的“LocationUpdates”示例。此应用程序获取并打印位置通知。

我正在尝试根据我的最新位置更改位置更新的间隔。

所以 - 我已将 mLocationRequest.setInterval() 添加到 onLocationChanged 中

结果非常错误。我的应用程序被许多位置更新轰炸(几秒钟!!!!)

我对示例的唯一更改是:

private int x=0;
@Override
public void onLocationChanged(Location location) {
    // Report to the UI that the location was updated
    mConnectionStatus.setText(R.string.location_updated);

    // In the UI, set the latitude and longitude to the value received
    mLatLng.setText(String.valueOf(x++));

    mLocationRequest.setInterval(1000);          // Change 1
    mLocationClient.requestLocationUpdates(mLocationRequest, this); // Change 2
}

如何更改 onLocationChanged 中的间隔?

我认为问题在于 requestLocationUpdates 重置了最后一个请求,然后立即发送另一个通知。所以创建了一个循环。 (比最快间隔快)。所以我需要一种可靠的方法来更改“实时”LocationRequest 的间隔

【问题讨论】:

  • 这也不起作用:locClient.requestLocationUpdates(mLocationRequest, this,Looper.getMainLooper());
  • 您是否尝试过onLocationChanged() 回调之外的mLocationRequest.setInterval(1000); 行?例如,在mLocationRequest 对象的初始化时。
  • 是的 - 实际上你在哪里调用它并不重要。
  • 您是否尝试过其他事件,例如事件名称中的“onbefore”?

标签: android google-play-services android-location


【解决方案1】:

您不应该在onLocationChanged(Location location) 内调用mLocationClient.requestLocationUpdates(mLocationRequest, this);

因为你再次注册了监听器,你会立即接到第一个电话。

所以我会做的是:

  1. 不要打电话给mLocationClient.requestLocationUpdates(mLocationRequest, this);,看看mLocationRequest.setInterval(1000);是否生效
  2. 如果这不起作用,请尝试取消注册侦听器,然后使用技巧等待,然后使用新设置再次注册它,例如:

     Handler h = new Handler();
     @Override
       public void onLocationChanged(Location location) {
        //... all your code
    
    
         mLocationRequest.setInterval(1000);          
         mLocationClient.removeLocationUpdates(LocationListener listener)
    
         h.postDelayed (new Runnable(){
    
           public void run(){
             mLocationClient.requestLocationUpdates(mLocationRequest, YOUROUTTERCLASS.this); 
           }
    
         }, 1000);
    
        }
    

    所以在一秒钟内没有注册的监听器,所以你不会得到任何更新,之后,监听器就会注册到那个间隔。

【讨论】:

    【解决方案2】:

    尝试使用mLocationRequest.setFastestInterval(long millis)
    如 developer.android.com 中所述:

    这允许您的应用程序以比主动获取位置更快的速度被动获取位置,从而节省电力。与 setInterval(long) 不同,此参数是精确的。您的应用程序接收更新的速度永远不会超过此值。

    【讨论】:

    • 我做到了,并将最快的速率设置为 1000。但我仍然每秒收到很多通知!?
    • 那么也许删除以前的更新然后开始一个新的 LocationRequest 可能会有所帮助,尽管 android 说“mLocationClient.requestLocationUpdates(mLocationRequest, this);”替换旧的,但还有许多错误尚未解决;)
    • 我认为问题在于requestLocationUpdates重置了最后一个请求,然后立即发送另一个通知。所以创建了一个循环。 (比最快间隔快)。所以我需要一种可靠的方法来改变间隔
    【解决方案3】:

    尝试使用:

    mLocationRequest.requestLocationUpdates("gps", 1000, 0, this);
    

    但是我不同意在 onLocationChanged 事件中执行 requestLocationUpdates;在我看来应该设置在 onLocationChanged 事件之外...

    【讨论】:

    • 我从哪里调用它并不重要。关键是当您重置更新时,您可能会非常快地收到下一个通知,甚至比最快的速度还要快。
    • 可能根本无法更改间隔。只重启请求,不可靠。
    • 我的解决方案是将当前通知时间与之前的通知时间进行比较,如果它们太接近则忽略它 - 荒谬。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2019-03-12
    相关资源
    最近更新 更多