Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

can not setInterval in onLocationChanged

I am trying the 'LocationUpdates' sample from http://developer.android.com/training/location/receive-location-updates.html . This application gets and prints location notifications.

I am trying to change the interval of the location updates according to my latest location.

So - I had added mLocationRequest.setInterval() into onLocationChanged

The result is very wrong. My application is bombarded with many location updates (few a second!!!!)

My only change to the sample is this:

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
}

How can I change the interval inside onLocationChanged ?

I think that the problem is that requestLocationUpdates resets the last request, and then immediately sends another notification. so a loop is created. (faster than the fastest interval). so I need a reliable way to change the interval of a 'live' LocationRequest

like image 963
DuduArbel Avatar asked Apr 27 '14 14:04

DuduArbel


1 Answers

You are not supposed to call mLocationClient.requestLocationUpdates(mLocationRequest, this); inside onLocationChanged(Location location)

since you are registering the listener again, and you will get the first call immediately.

so what i would do would be:

  1. dont call mLocationClient.requestLocationUpdates(mLocationRequest, this); and see if anyways mLocationRequest.setInterval(1000); is taking effect
  2. if this doesnt work, try to unregister the listener, and then use a trick to wait before registering it again with the new settings, something like:

     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);
    
        }
    

    So during one second there is not registered listener, so you wont get any updated, and after that, the listener is registerered with that interval.

like image 116
Carlos Robles Avatar answered Oct 11 '22 11:10

Carlos Robles