не может установить интервал в onLocationChanged

Я пробую пример «LocationUpdates» с http://developer.android.com/training/location/receive-location-updates.html . Это приложение получает и распечатывает уведомления о местоположении.

Я пытаюсь изменить интервал обновления местоположения в соответствии с моим последним местоположением.

Итак, я добавил 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


person DuduArbel    schedule 27.04.2014    source источник
comment
Это также не работает: locClient.requestLocationUpdates(mLocationRequest, this,Looper.getMainLooper());   -  person DuduArbel    schedule 27.04.2014
comment
Вы пробовали использовать строку mLocationRequest.setInterval(1000); вне обратного вызова onLocationChanged()? Например, во время инициализации объекта mLocationRequest.   -  person nKn    schedule 01.05.2014
comment
да - на самом деле не имеет значения, где вы это называете.   -  person DuduArbel    schedule 01.05.2014
comment
Вы пробовали другие события, такие как onbefore, в имени события?   -  person user3250966    schedule 07.05.2014


Ответы (3)


Вы не должны звонить mLocationClient.requestLocationUpdates(mLocationRequest, this); внутри onLocationChanged(Location location)

так как вы снова регистрируете слушателя, и вы сразу же получите первый вызов.

так что я бы сделал:

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

    Таким образом, в течение одной секунды нет зарегистрированного слушателя, поэтому вы не получите никаких обновлений, и после этого слушатель регистрируется с этим интервалом.

person Carlos Robles    schedule 07.05.2014

Попробуйте использовать mLocationRequest.setFastestInterval(long millis)
Как указано на сайте developer.android.com:

Это позволяет вашему приложению пассивно получать данные о местоположении быстрее, чем активно, что позволяет экономить электроэнергию. В отличие от setInterval(long), этот параметр является точным. Ваше приложение никогда не будет получать обновления быстрее, чем это значение.

person Ankit Bansal    schedule 01.05.2014
comment
Я сделал это и установил максимальную скорость 1000. Тем не менее, я все еще получаю много уведомлений в секунду !? - person DuduArbel; 01.05.2014
comment
Тогда, возможно, может помочь удаление предыдущих обновлений, а затем запуск нового LocationRequest, хотя андроид говорит mLocationClient.requestLocationUpdates(mLocationRequest, this); заменить старые, но есть много ошибок, которые еще предстоит решить;) - person Ankit Bansal; 01.05.2014
comment
Я думаю, что проблема в том, что requestLocationUpdates сбрасывает последний запрос, а потом сразу отправляет другое уведомление. таким образом создается петля. (быстрее самого быстрого интервала). поэтому мне нужен надежный способ изменить интервал - person DuduArbel; 01.05.2014

Попробуй использовать :

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

Однако я не согласен выполнять requestLocationUpdates в событии onLocationChanged; На мой взгляд, следует установить вне события onLocationChanged...

person Ciro Rizzo    schedule 05.05.2014
comment
Неважно, откуда я звоню. Дело в том, что когда вы сбрасываете обновления, вы можете получить следующее уведомление очень быстро, даже быстрее, чем самая высокая скорость. - person DuduArbel; 07.05.2014
comment
Вероятно, вообще невозможно изменить интервал. только перезапустите запрос, что ненадежно. - person DuduArbel; 07.05.2014
comment
Мое решение состоит в том, чтобы сравнить текущее время уведомления с предыдущим временем уведомления и игнорировать его, если они слишком близки - абсурдно. - person DuduArbel; 07.05.2014