2014-04-27 11 views
8

Próbuję próbki "LocationUpdates" z http://developer.android.com/training/location/receive-location-updates.html. Ta aplikacja pobiera i drukuje powiadomienia o lokalizacji.nie można ustawić interwala w onLocationChanged

Próbuję zmienić interwał aktualizacji lokalizacji zgodnie z moją ostatnią lokalizacją.

Tak - ja dodaje mLocationRequest.setInterval() do onLocationChanged

Rezultatem jest bardzo źle. Moja aplikacja jest bombardowany wielu aktualizacjach lokalizacji (kilka sekundy !!!!)

Jedyna zmiana w próbce jest taka:

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 
} 

Jak mogę zmienić odstęp wewnątrz onLocationChanged?

Myślę, że problem polega na tym, że requestLocationUpdates resetuje ostatnie żądanie, a następnie natychmiast wysyła kolejne powiadomienie. więc tworzona jest pętla. (szybciej niż najszybszy interwał). więc muszę niezawodny sposób, aby zmienić interwał a „na żywo” LocationRequest

+0

To również nie działa: locClient.requestLocationUpdates (mLocationRequest, this, Looper.getMainLooper()); – DuduArbel

+0

Czy wypróbowałeś wiersz 'mLocationRequest.setInterval (1000);' poza wywołaniem 'onLocationChanged()'? Na przykład w czasie inicjalizacji obiektu 'mLocationRequest'. – nKn

+0

tak - w rzeczywistości nie ma znaczenia, gdzie go nazwiesz. – DuduArbel

Odpowiedz

0

Spróbuj użyć mLocationRequest.setFastestInterval(long millis)
Jak wspomniano w developer.android.com:

Pozwala aplikacji biernie nabycia lokalizacje przy szybciej niż aktywnie pozyskuje lokalizacje, oszczędzając energię. W przeciwieństwie do setInterval (long), ten parametr jest dokładny. Twoja aplikacja nigdy nie otrzyma aktualizacji szybciej niż ta wartość.

+0

Zrobiłem to i ustawiłem najszybszą stawkę na 1000. Niemniej jednak otrzymuję wiele powiadomień na sekundę!? – DuduArbel

+0

Może wtedy usunięcie poprzednich aktualizacji, a następnie uruchomienie nowego testu LocationRequest może pomóc, chociaż android mówi "mLocationClient.requestLocationUpdates (mLocationRequest, this);" zastąpić stare, ale istnieje jeszcze wiele błędów do rozwiązania;) –

+0

Myślę, że problem polega na tym, że requestLocationUpdates resetuje ostatnie żądanie, a następnie natychmiast wysyła kolejne powiadomienie. więc tworzona jest pętla. (szybciej niż najszybszy interwał). więc potrzebuję niezawodnego sposobu na zmianę przedziału – DuduArbel

0

spróbuje użyć:

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

Jednak nie zgadzam się zrobić requestLocationUpdates w onLocationChanged zdarzenia; Moim zdaniem powinny być setted poza onLocationChanged zdarzenia ...

+0

Nie ma znaczenia, skąd go nazywam. Chodzi o to, że po zresetowaniu aktualizacji bardzo szybko otrzymasz następne powiadomienie, nawet szybciej niż najszybsza stawka. – DuduArbel

+0

Prawdopodobnie nie można w ogóle zmienić interwału. tylko zrestartuj żądanie, które jest niewiarygodne. – DuduArbel

+1

Moim rozwiązaniem jest porównanie aktualnego czasu powiadomienia z poprzednim czasem powiadomienia i zignorowanie go, jeśli są zbyt blisko - absurdalne. – DuduArbel

1

Nie mają zadzwonić mLocationClient.requestLocationUpdates(mLocationRequest, this); wewnątrz onLocationChanged(Location location)

skoro znowu rejestracji słuchacza i natychmiast dostać pierwsze połączenie.

więc co chciałbym zrobić to:

  1. nie nazywają mLocationClient.requestLocationUpdates(mLocationRequest, this); i sprawdzić, czy jakikolwiek mLocationRequest.setInterval(1000); bierze efekt
  2. jeśli tego nie robi praca, spróbuj wyrejestrować słuchacza, a następnie użyć sztuczki czekać przed zarejestrowaniem go ponownie z nowymi ustawieniami, coś jak:

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

    więc podczas jednej sekundy nie jest zarejestrowany słuchacza, więc przyzwyczajenie się wszelkie uaktualnione, a po to, że słuchacz jest rejestrowany z tym interwałem.

Powiązane problemy